Skip to content

Commit 983c9e4

Browse files
committed
add support for dictview(keys / items) set operations
- consolidated DictView/Items builtins support
1 parent 5e7ed7f commit 983c9e4

File tree

8 files changed

+297
-316
lines changed

8 files changed

+297
-316
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,35 @@ def test_create_seq_and_kw():
289289
d = dict(dict(a=1, b=2, c=3), d=4)
290290
for k in ['a', 'b', 'c', 'd']:
291291
assert k in d
292+
293+
294+
def test_dictview_set_operations_on_keys():
295+
k1 = {1: 1, 2: 2}.keys()
296+
k2 = {1: 1, 2: 2, 3: 3}.keys()
297+
k3 = {4: 4}.keys()
298+
299+
assert k1 - k2 == set()
300+
assert k1 - k3 == {1, 2}
301+
assert k2 - k1 == {3}
302+
assert k3 - k1 == {4}
303+
assert k1 & k2 == {1, 2}
304+
assert k1 & k3 == set()
305+
assert k1 | k2 == {1, 2, 3}
306+
assert k1 ^ k2 == {3}
307+
assert k1 ^ k3 == {1, 2, 4}
308+
309+
310+
def test_dictview_set_operations_on_items():
311+
k1 = {1: 1, 2: 2}.items()
312+
k2 = {1: 1, 2: 2, 3: 3}.items()
313+
k3 = {4: 4}.items()
314+
315+
assert k1 - k2 == set()
316+
# assert k1 - k3 == {(1, 1), (2, 2)}
317+
# assert k2 - k1 == {(3, 3)}
318+
# assert k3 - k1 == {(4, 4)}
319+
# assert k1 & k2 == {(1, 1), (2, 2)}
320+
# assert k1 & k3 == set()
321+
# assert k1 | k2 == {(1, 1), (2, 2), (3, 3)}
322+
# assert k1 ^ k2 == {(3, 3)}
323+
# assert k1 ^ k3 == {(1, 1), (2, 2), (4, 4)}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,11 @@
8282
import com.oracle.graal.python.builtins.objects.common.HashingStorage.DictEntry;
8383
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
8484
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
85-
import com.oracle.graal.python.builtins.objects.dict.DictItemsBuiltins;
8685
import com.oracle.graal.python.builtins.objects.dict.DictItemsIteratorBuiltins;
87-
import com.oracle.graal.python.builtins.objects.dict.DictKeysBuiltins;
8886
import com.oracle.graal.python.builtins.objects.dict.DictKeysIteratorBuiltins;
8987
import com.oracle.graal.python.builtins.objects.dict.DictValuesBuiltins;
9088
import com.oracle.graal.python.builtins.objects.dict.DictValuesIteratorBuiltins;
89+
import com.oracle.graal.python.builtins.objects.dict.DictViewBuiltins;
9190
import com.oracle.graal.python.builtins.objects.dict.PDict;
9291
import com.oracle.graal.python.builtins.objects.enumerate.EnumerateBuiltins;
9392
import com.oracle.graal.python.builtins.objects.exception.BaseExceptionBuiltins;
@@ -216,11 +215,10 @@ public final class Python3Core implements PythonCore {
216215
new TruffleObjectBuiltins(),
217216
new ListBuiltins(),
218217
new DictBuiltins(),
219-
new DictKeysBuiltins(),
220-
new DictKeysIteratorBuiltins(),
218+
new DictViewBuiltins(),
221219
new DictValuesBuiltins(),
220+
new DictKeysIteratorBuiltins(),
222221
new DictValuesIteratorBuiltins(),
223-
new DictItemsBuiltins(),
224222
new DictItemsIteratorBuiltins(),
225223
new RangeBuiltins(),
226224
new SliceBuiltins(),

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,6 +1277,41 @@ public static UnionNode create() {
12771277
}
12781278
}
12791279

1280+
public static class ExclusiveOrNode extends Node {
1281+
@Child private ContainsKeyNode containsKeyNode;
1282+
@Child private SetItemNode setItemNode;
1283+
1284+
public HashingStorage execute(HashingStorage left, HashingStorage right) {
1285+
EconomicMapStorage newStorage = EconomicMapStorage.create(false);
1286+
if (left.length() != 0 && right.length() != 0) {
1287+
if (containsKeyNode == null) {
1288+
CompilerDirectives.transferToInterpreterAndInvalidate();
1289+
containsKeyNode = insert(ContainsKeyNode.create());
1290+
}
1291+
if (setItemNode == null) {
1292+
CompilerDirectives.transferToInterpreterAndInvalidate();
1293+
setItemNode = insert(SetItemNode.create());
1294+
}
1295+
1296+
for (Object leftKey : left.keys()) {
1297+
if (!containsKeyNode.execute(right, leftKey)) {
1298+
setItemNode.execute(null, newStorage, leftKey, PNone.NO_VALUE);
1299+
}
1300+
}
1301+
for (Object rightKey : right.keys()) {
1302+
if (!containsKeyNode.execute(left, rightKey)) {
1303+
setItemNode.execute(null, newStorage, rightKey, PNone.NO_VALUE);
1304+
}
1305+
}
1306+
}
1307+
return newStorage;
1308+
}
1309+
1310+
public static ExclusiveOrNode create() {
1311+
return new ExclusiveOrNode();
1312+
}
1313+
}
1314+
12801315
public abstract static class DiffNode extends DictStorageBaseNode {
12811316

12821317
public abstract HashingStorage execute(HashingStorage left, HashingStorage right);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictItemsBuiltins.java

Lines changed: 0 additions & 94 deletions
This file was deleted.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictKeysBuiltins.java

Lines changed: 0 additions & 120 deletions
This file was deleted.

0 commit comments

Comments
 (0)