Skip to content

Commit 133ece9

Browse files
committed
Adding specializaiton for & and | operations between set, frozenset and a dictview.
1 parent 97a8568 commit 133ece9

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_set.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ def test_set_or_union():
8080
assert or_result == {1, 2, 3}
8181
assert union_result == {1, 2, 3}
8282

83+
assert frozenset((1,2)) | {1:2}.items() == {1, 2, (1, 2)}
84+
assert frozenset((1,2)) | {1:2}.keys() == {1, 2}
85+
86+
def test_set_and():
87+
assert frozenset((1,2)) & {1:2}.items() == set()
88+
assert frozenset((1,2)) & {1:2}.keys() == {1}
8389

8490
def test_set_union():
8591
assert {1, 2, 3}.union({1: 'a', 2: 'b', 4: 'd'}) == {1, 2, 3, 4}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
5353
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.PythonEquivalence;
5454
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
55+
import com.oracle.graal.python.builtins.objects.dict.PDictView;
5556
import com.oracle.graal.python.builtins.objects.set.FrozenSetBuiltinsFactory.BinaryUnionNodeGen;
5657
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5758
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -208,6 +209,22 @@ PBaseSet doPBaseSet(PFrozenSet left, PBaseSet right) {
208209
return factory().createFrozenSet(intersectedStorage);
209210
}
210211

212+
@Specialization
213+
PBaseSet doPBaseSet(PSet left, PDictView right,
214+
@Cached("create()") SetNodes.ConstructSetNode constructSetNode) {
215+
PSet rightSet = constructSetNode.executeWith(right);
216+
HashingStorage intersectedStorage = getIntersectNode().execute(left.getDictStorage(), rightSet.getDictStorage());
217+
return factory().createSet(intersectedStorage);
218+
}
219+
220+
@Specialization
221+
PBaseSet doPBaseSet(PFrozenSet left, PDictView right,
222+
@Cached("create()") SetNodes.ConstructSetNode constructSetNode) {
223+
PSet rightSet = constructSetNode.executeWith(right);
224+
HashingStorage intersectedStorage = getIntersectNode().execute(left.getDictStorage(), rightSet.getDictStorage());
225+
return factory().createSet(intersectedStorage);
226+
}
227+
211228
@Fallback
212229
Object doAnd(Object self, Object other) {
213230
throw raise(PythonErrorType.TypeError, "unsupported operand type(s) for &: '%p' and '%p'", self, other);
@@ -267,9 +284,25 @@ PBaseSet doPBaseSet(PFrozenSet left, PBaseSet right) {
267284
HashingStorage intersectedStorage = getUnionNode().execute(left.getDictStorage(), right.getDictStorage());
268285
return factory().createFrozenSet(intersectedStorage);
269286
}
270-
287+
288+
@Specialization
289+
PBaseSet doPBaseSet(PSet left, PDictView right,
290+
@Cached("create()") SetNodes.ConstructSetNode constructSetNode) {
291+
PSet rightSet = constructSetNode.executeWith(right);
292+
HashingStorage intersectedStorage = getUnionNode().execute(left.getDictStorage(), rightSet.getDictStorage());
293+
return factory().createSet(intersectedStorage);
294+
}
295+
296+
@Specialization
297+
PBaseSet doPBaseSet(PFrozenSet left, PDictView right,
298+
@Cached("create()") SetNodes.ConstructSetNode constructSetNode) {
299+
PSet rightSet = constructSetNode.executeWith(right);
300+
HashingStorage intersectedStorage = getUnionNode().execute(left.getDictStorage(), rightSet.getDictStorage());
301+
return factory().createSet(intersectedStorage);
302+
}
303+
271304
@Fallback
272-
Object doAnd(Object self, Object other) {
305+
Object doOr(Object self, Object other) {
273306
throw raise(PythonErrorType.TypeError, "unsupported operand type(s) for |: '%p' and '%p'", self, other);
274307
}
275308
}

0 commit comments

Comments
 (0)