Skip to content

Commit bc583c3

Browse files
committed
Make test_set and test_weakset pass
1 parent cfe2ab3 commit bc583c3

File tree

21 files changed

+1505
-904
lines changed

21 files changed

+1505
-904
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_set.txt

Lines changed: 115 additions & 0 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakset.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_add
12
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_and
23
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_clear
34
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_constructor_identity
5+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_contains
46
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_copy
57
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_difference
8+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_difference_update
69
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_discard
710
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_eq
811
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_gc
912
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_gt
1013
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_hash
14+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_iand
1115
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_init
16+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_inplace_on_self
17+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_intersection
18+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_intersection_update
1219
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ior
1320
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_isdisjoint
1421
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_isub
22+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ixor
23+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len
24+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len_cycles
25+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len_race
1526
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_lt
1627
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_methods
1728
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ne
@@ -23,5 +34,11 @@
2334
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_sub
2435
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_sub_and_super
2536
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_subclass_with_custom_hash
37+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_symmetric_difference
38+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_symmetric_difference_update
39+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_union
2640
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_update
2741
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_update_set
42+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_weak_destroy_and_mutate_while_iterating
43+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_weak_destroy_while_iterating
44+
*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_xor

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@
157157
import com.oracle.graal.python.builtins.objects.range.RangeBuiltins;
158158
import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltins;
159159
import com.oracle.graal.python.builtins.objects.reversed.ReversedBuiltins;
160+
import com.oracle.graal.python.builtins.objects.set.BaseSetBuiltins;
160161
import com.oracle.graal.python.builtins.objects.set.FrozenSetBuiltins;
161162
import com.oracle.graal.python.builtins.objects.set.SetBuiltins;
162163
import com.oracle.graal.python.builtins.objects.slice.SliceBuiltins;
@@ -235,7 +236,6 @@ private static String[] initializeCoreFiles() {
235236
"classes",
236237
"__graalpython__",
237238
"_weakref",
238-
"set",
239239
"itertools",
240240
"faulthandler",
241241
"base_exception",
@@ -334,6 +334,7 @@ private static PythonBuiltins[] initializeBuiltins() {
334334
new SliceBuiltins(),
335335
new TupleBuiltins(),
336336
new StringBuiltins(),
337+
new BaseSetBuiltins(),
337338
new SetBuiltins(),
338339
new FrozenSetBuiltins(),
339340
new IteratorBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 36 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@
156156
import com.oracle.graal.python.builtins.objects.range.RangeNodes;
157157
import com.oracle.graal.python.builtins.objects.set.PFrozenSet;
158158
import com.oracle.graal.python.builtins.objects.set.PSet;
159-
import com.oracle.graal.python.builtins.objects.set.SetNodes;
160159
import com.oracle.graal.python.builtins.objects.str.PString;
161160
import com.oracle.graal.python.builtins.objects.superobject.SuperObject;
162161
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
@@ -1026,7 +1025,7 @@ Object doPythonObject(VirtualFrame frame, Object cls, Object obj,
10261025
// floatobject.c we have to first create a temporary float, then fill it into
10271026
// a natively allocated subtype structure
10281027
@Specialization(guards = "isSubtypeOfFloat(frame, isSubtype, cls)", limit = "1")
1029-
Object doPythonObject(VirtualFrame frame, PythonNativeClass cls, Object obj,
1028+
static Object doPythonObject(VirtualFrame frame, PythonNativeClass cls, Object obj,
10301029
@Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype,
10311030
@Cached CExtNodes.FloatSubtypeNew subtypeNew,
10321031
@Cached FloatNode recursiveCallNode) {
@@ -1076,46 +1075,28 @@ private boolean isNaN(double d) {
10761075
@GenerateNodeFactory
10771076
public abstract static class FrozenSetNode extends PythonBuiltinNode {
10781077

1079-
@Child private HashingCollectionNodes.SetItemNode setItemNode;
1080-
10811078
@Specialization(guards = "isNoValue(arg)")
10821079
public PFrozenSet frozensetEmpty(Object cls, @SuppressWarnings("unused") PNone arg) {
10831080
return factory().createFrozenSet(cls);
10841081
}
10851082

1086-
@Specialization
1087-
public PFrozenSet frozenset(VirtualFrame frame, Object cls, String arg) {
1088-
PFrozenSet frozenSet = factory().createFrozenSet(cls);
1089-
for (int i = 0; i < PString.length(arg); i++) {
1090-
getSetItemNode().execute(frame, frozenSet, PString.valueOf(PString.charAt(arg, i)), PNone.NONE);
1091-
}
1092-
return frozenSet;
1083+
@Specialization(guards = "isBuiltinClass.profileIsAnyBuiltinClass(cls)")
1084+
public static PFrozenSet frozensetIdentity(@SuppressWarnings("unused") Object cls, PFrozenSet arg,
1085+
@SuppressWarnings("unused") @Cached IsBuiltinClassProfile isBuiltinClass) {
1086+
return arg;
10931087
}
10941088

1095-
@Specialization(guards = "!isNoValue(iterable)")
1096-
public PFrozenSet frozensetIterable(VirtualFrame frame, Object cls, Object iterable,
1097-
@Cached("create()") GetIteratorNode getIterator,
1098-
@Cached("create()") GetNextNode next,
1099-
@Cached("create()") IsBuiltinClassProfile errorProfile) {
1100-
1101-
Object iterator = getIterator.executeWith(frame, iterable);
1102-
PFrozenSet frozenSet = factory().createFrozenSet(cls);
1103-
while (true) {
1104-
try {
1105-
getSetItemNode().execute(frame, frozenSet, next.execute(frame, iterator), PNone.NONE);
1106-
} catch (PException e) {
1107-
e.expectStopIteration(errorProfile);
1108-
return frozenSet;
1109-
}
1110-
}
1089+
@Specialization(guards = "!isBuiltinClass.profileIsAnyBuiltinClass(cls)")
1090+
public PFrozenSet subFrozensetIdentity(Object cls, PFrozenSet arg,
1091+
@SuppressWarnings("unused") @Cached IsBuiltinClassProfile isBuiltinClass) {
1092+
return factory().createFrozenSet(cls, arg.getDictStorage());
11111093
}
11121094

1113-
private HashingCollectionNodes.SetItemNode getSetItemNode() {
1114-
if (setItemNode == null) {
1115-
CompilerDirectives.transferToInterpreterAndInvalidate();
1116-
setItemNode = insert(HashingCollectionNodes.SetItemNode.create());
1117-
}
1118-
return setItemNode;
1095+
@Specialization(guards = {"!isNoValue(iterable)", "!isPFrozenSet(iterable)"})
1096+
public PFrozenSet frozensetIterable(VirtualFrame frame, Object cls, Object iterable,
1097+
@Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode) {
1098+
HashingStorage storage = getHashingStorageNode.doNoValue(frame, iterable);
1099+
return factory().createFrozenSet(cls, storage);
11191100
}
11201101
}
11211102

@@ -1593,7 +1574,7 @@ private static String toString(byte[] barr) {
15931574
@ReportPolymorphism
15941575
public abstract static class BoolNode extends PythonBinaryBuiltinNode {
15951576
@Specialization(limit = "getCallSiteInlineCacheMaxDepth()")
1596-
public boolean bool(VirtualFrame frame, Object cls, Object obj,
1577+
public static boolean bool(VirtualFrame frame, Object cls, Object obj,
15971578
@Cached("createBinaryProfile()") ConditionProfile hasFrame,
15981579
@CachedLibrary("obj") PythonObjectLibrary lib) {
15991580
if (hasFrame.profile(frame != null)) {
@@ -1854,35 +1835,29 @@ Object doGeneric(@SuppressWarnings("unused") Object cls, Object start, Object st
18541835
}
18551836
}
18561837

1857-
protected boolean isStop(Object start, Object stop, Object step) {
1838+
protected static boolean isStop(Object start, Object stop, Object step) {
18581839
return isNoValue(start) && !isNoValue(stop) && isNoValue(step);
18591840
}
18601841

1861-
protected boolean isStartStop(Object start, Object stop, Object step) {
1842+
protected static boolean isStartStop(Object start, Object stop, Object step) {
18621843
return !isNoValue(start) && !isNoValue(stop) && isNoValue(step);
18631844
}
18641845

1865-
protected boolean isStartStopStep(Object start, Object stop, Object step) {
1846+
protected static boolean isStartStopStep(Object start, Object stop, Object step) {
18661847
return !isNoValue(start) && !isNoValue(stop) && !isNoValue(step);
18671848
}
18681849
}
18691850

18701851
// set([iterable])
1871-
@Builtin(name = SET, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PSet)
1852+
@Builtin(name = SET, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PSet)
18721853
@GenerateNodeFactory
18731854
public abstract static class SetNode extends PythonBuiltinNode {
18741855

1875-
@Specialization(guards = "lib.isLazyPythonClass(cls)")
1876-
protected PSet constructSet(VirtualFrame frame, Object cls, Object value,
1877-
@Cached("create()") SetNodes.ConstructSetNode constructSetNode,
1878-
@SuppressWarnings("unused") @CachedLibrary(limit = "3") PythonObjectLibrary lib) {
1879-
return constructSetNode.execute(frame, cls, value);
1856+
@Specialization
1857+
public PSet setEmpty(Object cls, @SuppressWarnings("unused") Object arg) {
1858+
return factory().createSet(cls);
18801859
}
18811860

1882-
@Fallback
1883-
public PSet listObject(@SuppressWarnings("unused") Object cls, Object arg) {
1884-
throw raise(TypeError, ErrorMessages.SET_DOES_NOT_SUPPORT_ITERABLE_OBJ, arg);
1885-
}
18861861
}
18871862

18881863
// str(object='')
@@ -1952,7 +1927,7 @@ private Object decodeBytes(VirtualFrame frame, Object strClass, PBytes obj, Obje
19521927
* into a natively allocated subtype structure
19531928
*/
19541929
@Specialization(guards = {"isNativeClass(cls)", "isSubtypeOfString(frame, isSubtype, cls)", "isNoValue(encoding)", "isNoValue(errors)"})
1955-
Object doNativeSubclass(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") Object encoding,
1930+
static Object doNativeSubclass(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") Object encoding,
19561931
@SuppressWarnings("unused") Object errors,
19571932
@Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype,
19581933
@CachedLibrary(limit = "2") PythonObjectLibrary lib,
@@ -2003,14 +1978,14 @@ private ConditionProfile getIsPStringProfile() {
20031978
public abstract static class TupleNode extends PythonBinaryBuiltinNode {
20041979

20051980
@Specialization(guards = "!isNativeClass(cls)")
2006-
protected PTuple constructTuple(VirtualFrame frame, Object cls, Object iterable,
1981+
protected static PTuple constructTuple(VirtualFrame frame, Object cls, Object iterable,
20071982
@Cached("create()") TupleNodes.ConstructTupleNode constructTupleNode) {
20081983
return constructTupleNode.execute(frame, cls, iterable);
20091984
}
20101985

20111986
// delegate to tuple_subtype_new(PyTypeObject *type, PyObject *x)
20121987
@Specialization(guards = {"isNativeClass(cls)", "isSubtypeOfTuple(frame, isSubtype, cls)"}, limit = "1")
2013-
Object doNative(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object iterable,
1988+
static Object doNative(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object iterable,
20141989
@Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype,
20151990
@Cached CExtNodes.TupleSubtypeNew subtypeNew) {
20161991
return subtypeNew.call(cls, iterable);
@@ -2154,7 +2129,7 @@ public abstract static class TypeNode extends PythonBuiltinNode {
21542129

21552130
@Specialization(guards = {"isNoValue(bases)", "isNoValue(dict)"})
21562131
@SuppressWarnings("unused")
2157-
Object type(Object cls, Object obj, PNone bases, PNone dict, PKeyword[] kwds,
2132+
static Object type(Object cls, Object obj, PNone bases, PNone dict, PKeyword[] kwds,
21582133
@Cached GetClassNode getClass) {
21592134
return getClass.execute(obj);
21602135
}
@@ -2553,6 +2528,7 @@ private void addNativeSlots(PythonManagedClass pythonClass, PTuple slots) {
25532528
if (callAddNativeSlotsNode == null) {
25542529
CompilerDirectives.transferToInterpreterAndInvalidate();
25552530
callAddNativeSlotsNode = insert(CExtNodes.PCallCapiFunction.create());
2531+
toSulongNode = insert(CExtNodes.ToSulongNode.create());
25562532
}
25572533
callAddNativeSlotsNode.call(FUN_ADD_NATIVE_SLOTS, toSulongNode.execute(pythonClass), toSulongNode.execute(slots));
25582534
}
@@ -2743,7 +2719,7 @@ Object doNative(PythonAbstractNativeObject self, Object[] varargs, PKeyword[] kw
27432719
public abstract static class NotImplementedTypeNode extends PythonBuiltinNode {
27442720
@SuppressWarnings("unused")
27452721
@Specialization
2746-
public PNotImplemented module(Object cls) {
2722+
public static PNotImplemented module(Object cls) {
27472723
return PNotImplemented.NOT_IMPLEMENTED;
27482724
}
27492725
}
@@ -2753,7 +2729,7 @@ public PNotImplemented module(Object cls) {
27532729
public abstract static class EllipsisTypeNode extends PythonBuiltinNode {
27542730
@SuppressWarnings("unused")
27552731
@Specialization
2756-
public PEllipsis call(Object cls) {
2732+
public static PEllipsis call(Object cls) {
27572733
return PEllipsis.INSTANCE;
27582734
}
27592735
}
@@ -2763,7 +2739,7 @@ public PEllipsis call(Object cls) {
27632739
public abstract static class NoneTypeNode extends PythonBuiltinNode {
27642740
@SuppressWarnings("unused")
27652741
@Specialization
2766-
public PNone module(Object cls) {
2742+
public static PNone module(Object cls) {
27672743
return PNone.NONE;
27682744
}
27692745
}
@@ -2934,15 +2910,15 @@ Object call() {
29342910
@GenerateNodeFactory
29352911
public abstract static class TracebackTypeNode extends PythonBuiltinNode {
29362912
@Specialization(limit = "1")
2937-
Object createTraceback(@SuppressWarnings("unused") Object cls, PTraceback next, PFrame frame, Object lasti, Object lineno,
2913+
static Object createTraceback(@SuppressWarnings("unused") Object cls, PTraceback next, PFrame frame, Object lasti, Object lineno,
29382914
@CachedLibrary("lasti") PythonObjectLibrary lastiLib,
29392915
@CachedLibrary("lineno") PythonObjectLibrary linenoLib,
29402916
@Cached PythonObjectFactory factory) {
29412917
return factory.createTraceback(frame, linenoLib.asSize(lineno), lastiLib.asSize(lasti), next);
29422918
}
29432919

29442920
@Specialization(limit = "1")
2945-
Object createTraceback(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") PNone next, PFrame frame, Object lasti, Object lineno,
2921+
static Object createTraceback(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") PNone next, PFrame frame, Object lasti, Object lineno,
29462922
@CachedLibrary("lasti") PythonObjectLibrary lastiLib,
29472923
@CachedLibrary("lineno") PythonObjectLibrary linenoLib,
29482924
@Cached PythonObjectFactory factory) {
@@ -3102,7 +3078,7 @@ Object doInvalid(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnin
31023078
throw raise(TypeError, ErrorMessages.ARG_MUST_BE_S_NOT_P, "mappingproxy()", "mapping", obj);
31033079
}
31043080

3105-
protected boolean isBuiltinMapping(Object o) {
3081+
protected static boolean isBuiltinMapping(Object o) {
31063082
return o instanceof PHashingCollection;
31073083
}
31083084

@@ -3158,20 +3134,20 @@ public abstract static class CreateSliceNode extends PythonBuiltinNode {
31583134

31593135
@Specialization(guards = {"isNoValue(second)", "isNoValue(third)"})
31603136
@SuppressWarnings("unused")
3161-
Object stop(VirtualFrame frame, Object cls, Object first, Object second, Object third,
3137+
static Object stop(VirtualFrame frame, Object cls, Object first, Object second, Object third,
31623138
@Cached("create()") SliceLiteralNode sliceNode) {
31633139
return sliceNode.execute(frame, PNone.NONE, first, PNone.NONE);
31643140
}
31653141

31663142
@Specialization(guards = {"!isNoValue(second)", "isNoValue(third)"})
31673143
@SuppressWarnings("unused")
3168-
Object startStop(VirtualFrame frame, Object cls, Object first, Object second, Object third,
3144+
static Object startStop(VirtualFrame frame, Object cls, Object first, Object second, Object third,
31693145
@Cached("create()") SliceLiteralNode sliceNode) {
31703146
return sliceNode.execute(frame, first, second, PNone.NONE);
31713147
}
31723148

31733149
@Specialization(guards = {"!isNoValue(second)", "!isNoValue(third)"})
3174-
Object slice(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object first, Object second, Object third,
3150+
static Object slice(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object first, Object second, Object third,
31753151
@Cached("create()") SliceLiteralNode sliceNode) {
31763152
return sliceNode.execute(frame, first, second, third);
31773153
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,15 +610,49 @@ public Iterator<DictKey> getKeysIterator() {
610610
return keysIterator;
611611
}
612612

613+
@Override
613614
public boolean hasNext() {
614615
return keysIterator.hasNext();
615616
}
616617

618+
@Override
617619
public Object next() {
618620
return keysIterator.next().value;
619621
}
620622
}
621623

624+
protected void setValue(DictKey key, Object value, PythonObjectLibrary lib, ConditionProfile findProfile, ConditionProfile gotState, ThreadState state) {
625+
this.map.put(key, value, lib, lib, findProfile, gotState, state);
626+
}
627+
628+
protected HashingStorageIterable<DictKey> dictKeys() {
629+
return new HashingStorageIterable<>(new DictKeysIterator(map.getKeys().iterator()));
630+
}
631+
632+
static final class DictKeysIterator implements Iterator<DictKey> {
633+
private final Iterator<DictKey> keysIterator;
634+
635+
DictKeysIterator(Iterator<DictKey> iter) {
636+
this.keysIterator = iter;
637+
}
638+
639+
public Iterator<DictKey> getKeysIterator() {
640+
return keysIterator;
641+
}
642+
643+
@TruffleBoundary
644+
@Override
645+
public boolean hasNext() {
646+
return keysIterator.hasNext();
647+
}
648+
649+
@TruffleBoundary
650+
@Override
651+
public DictKey next() {
652+
return keysIterator.next();
653+
}
654+
}
655+
622656
@Override
623657
public String toString() {
624658
CompilerAsserts.neverPartOfCompilation();

0 commit comments

Comments
 (0)