Skip to content

Commit 66d2e95

Browse files
committed
Return the dict reverse iterator types from __reversed__
The __reversed__ methods of dict, dict_keys, dict_items and dict_values wrapped the reverse storage iterator with the forward factories, so reversed(d) was a dict_keyiterator and type(reversed(d)) is type(iter(d)) held. The PDictReverse*Iterator types were still defined and registered with IteratorBuiltins, but nothing created them since afc1f12 dropped the reverse factories. Restore createDictReverse{Key,Item,Value}Iterator in their former shape and use them at the four sites, as CPython builds these iterators from the PyDictRevIter*_Type types. Signed-off-by: Jeongseop Lim <jeongseop_lim@korea.ac.kr>
1 parent 7e7182b commit 66d2e95

5 files changed

Lines changed: 33 additions & 5 deletions

File tree

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,3 +2007,16 @@ def test_bulk_value_update_preserves_iterators():
20072007
d.update({k: -v for k, v in d.items()})
20082008
assert list(it) == expected[1:]
20092009
assert list(reverse) == expected[-2::-1]
2010+
2011+
2012+
def test_reversed_iterator_types():
2013+
d = {1: 'a', 2: 'b'}
2014+
assert type(reversed(d)).__name__ == 'dict_reversekeyiterator'
2015+
assert type(reversed(d.keys())).__name__ == 'dict_reversekeyiterator'
2016+
assert type(reversed(d.values())).__name__ == 'dict_reversevalueiterator'
2017+
assert type(reversed(d.items())).__name__ == 'dict_reverseitemiterator'
2018+
assert type(reversed(d)) is not type(iter(d))
2019+
assert_raises(TypeError, type(reversed(d)))
2020+
assert_raises(TypeError, type(reversed(d.values())))
2021+
assert_raises(TypeError, type(reversed(d.items())))
2022+
assert list(reversed(d.items())) == [(2, 'b'), (1, 'a')]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ static Object run(Object self,
436436
@Cached HashingStorageGetReverseIterator getReverseIterator,
437437
@Bind PythonLanguage language) {
438438
var storage = getStorageNode.execute(inliningTarget, self);
439-
return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
439+
return PFactory.createDictReverseKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
440440
}
441441
}
442442

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2026, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -109,7 +109,7 @@ static Object doPDictValuesView(PDictValuesView self,
109109
@Cached HashingStorageGetReverseIterator getReverseIter,
110110
@Bind PythonLanguage language) {
111111
HashingStorage storage = self.getWrappedStorage();
112-
return PFactory.createDictValueIterator(language, getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
112+
return PFactory.createDictReverseValueIterator(language, getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
113113
}
114114
}
115115
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ static Object getReversedKeysViewIter(PDictKeysView self,
193193
@Shared @Cached HashingStorageGetReverseIterator getReverseIterator,
194194
@Bind PythonLanguage language) {
195195
HashingStorage storage = self.getWrappedStorage();
196-
return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
196+
return PFactory.createDictReverseKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
197197
}
198198

199199
@Specialization
@@ -203,7 +203,7 @@ static Object getReversedItemsViewIter(PDictItemsView self,
203203
@Shared @Cached HashingStorageGetReverseIterator getReverseIterator,
204204
@Bind PythonLanguage language) {
205205
HashingStorage storage = self.getWrappedStorage();
206-
return PFactory.createDictItemIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
206+
return PFactory.createDictReverseItemIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
207207
}
208208
}
209209

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PFactory.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,14 +1037,29 @@ public static PDictItemIterator createDictItemIterator(PythonLanguage language,
10371037
initialSize);
10381038
}
10391039

1040+
public static PDictItemIterator createDictReverseItemIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
1041+
return new PDictItemIterator(PythonBuiltinClassType.PDictReverseItemIterator, PythonBuiltinClassType.PDictReverseItemIterator.getInstanceShape(language), iterator, hashingStorage,
1042+
initialSize);
1043+
}
1044+
10401045
public static PDictKeyIterator createDictKeyIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
10411046
return new PDictKeyIterator(PythonBuiltinClassType.PDictKeyIterator, PythonBuiltinClassType.PDictKeyIterator.getInstanceShape(language), iterator, hashingStorage, initialSize);
10421047
}
10431048

1049+
public static PDictKeyIterator createDictReverseKeyIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
1050+
return new PDictKeyIterator(PythonBuiltinClassType.PDictReverseKeyIterator, PythonBuiltinClassType.PDictReverseKeyIterator.getInstanceShape(language), iterator, hashingStorage,
1051+
initialSize);
1052+
}
1053+
10441054
public static PDictValueIterator createDictValueIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
10451055
return new PDictValueIterator(PythonBuiltinClassType.PDictValueIterator, PythonBuiltinClassType.PDictValueIterator.getInstanceShape(language), iterator, hashingStorage, initialSize);
10461056
}
10471057

1058+
public static PDictValueIterator createDictReverseValueIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
1059+
return new PDictValueIterator(PythonBuiltinClassType.PDictReverseValueIterator, PythonBuiltinClassType.PDictReverseValueIterator.getInstanceShape(language), iterator, hashingStorage,
1060+
initialSize);
1061+
}
1062+
10481063
public static Object createSentinelIterator(PythonLanguage language, Object callable, Object sentinel) {
10491064
return new PSentinelIterator(PythonBuiltinClassType.PSentinelIterator, PythonBuiltinClassType.PSentinelIterator.getInstanceShape(language), callable, sentinel);
10501065
}

0 commit comments

Comments
 (0)