Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions graalpython/com.oracle.graal.python.test/src/tests/test_dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -2007,3 +2007,16 @@ def test_bulk_value_update_preserves_iterators():
d.update({k: -v for k, v in d.items()})
assert list(it) == expected[1:]
assert list(reverse) == expected[-2::-1]


def test_reversed_iterator_types():
d = {1: 'a', 2: 'b'}
assert type(reversed(d)).__name__ == 'dict_reversekeyiterator'
assert type(reversed(d.keys())).__name__ == 'dict_reversekeyiterator'
assert type(reversed(d.values())).__name__ == 'dict_reversevalueiterator'
assert type(reversed(d.items())).__name__ == 'dict_reverseitemiterator'
assert type(reversed(d)) is not type(iter(d))
assert_raises(TypeError, type(reversed(d)))
assert_raises(TypeError, type(reversed(d.values())))
assert_raises(TypeError, type(reversed(d.items())))
assert list(reversed(d.items())) == [(2, 'b'), (1, 'a')]
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ static Object run(Object self,
@Cached HashingStorageGetReverseIterator getReverseIterator,
@Bind PythonLanguage language) {
var storage = getStorageNode.execute(inliningTarget, self);
return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
return PFactory.createDictReverseKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
* Copyright (c) 2017, 2026, Oracle and/or its affiliates.
* Copyright (c) 2013, Regents of the University of California
*
* All rights reserved.
Expand Down Expand Up @@ -109,7 +109,7 @@ static Object doPDictValuesView(PDictValuesView self,
@Cached HashingStorageGetReverseIterator getReverseIter,
@Bind PythonLanguage language) {
HashingStorage storage = self.getWrappedStorage();
return PFactory.createDictValueIterator(language, getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
return PFactory.createDictReverseValueIterator(language, getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ static Object getReversedKeysViewIter(PDictKeysView self,
@Shared @Cached HashingStorageGetReverseIterator getReverseIterator,
@Bind PythonLanguage language) {
HashingStorage storage = self.getWrappedStorage();
return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
return PFactory.createDictReverseKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
}

@Specialization
Expand All @@ -203,7 +203,7 @@ static Object getReversedItemsViewIter(PDictItemsView self,
@Shared @Cached HashingStorageGetReverseIterator getReverseIterator,
@Bind PythonLanguage language) {
HashingStorage storage = self.getWrappedStorage();
return PFactory.createDictItemIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
return PFactory.createDictReverseItemIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1037,14 +1037,29 @@ public static PDictItemIterator createDictItemIterator(PythonLanguage language,
initialSize);
}

public static PDictItemIterator createDictReverseItemIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
return new PDictItemIterator(PythonBuiltinClassType.PDictReverseItemIterator, PythonBuiltinClassType.PDictReverseItemIterator.getInstanceShape(language), iterator, hashingStorage,
initialSize);
}

public static PDictKeyIterator createDictKeyIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
return new PDictKeyIterator(PythonBuiltinClassType.PDictKeyIterator, PythonBuiltinClassType.PDictKeyIterator.getInstanceShape(language), iterator, hashingStorage, initialSize);
}

public static PDictKeyIterator createDictReverseKeyIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
return new PDictKeyIterator(PythonBuiltinClassType.PDictReverseKeyIterator, PythonBuiltinClassType.PDictReverseKeyIterator.getInstanceShape(language), iterator, hashingStorage,
initialSize);
}

public static PDictValueIterator createDictValueIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
return new PDictValueIterator(PythonBuiltinClassType.PDictValueIterator, PythonBuiltinClassType.PDictValueIterator.getInstanceShape(language), iterator, hashingStorage, initialSize);
}

public static PDictValueIterator createDictReverseValueIterator(PythonLanguage language, HashingStorageNodes.HashingStorageIterator iterator, HashingStorage hashingStorage, int initialSize) {
return new PDictValueIterator(PythonBuiltinClassType.PDictReverseValueIterator, PythonBuiltinClassType.PDictReverseValueIterator.getInstanceShape(language), iterator, hashingStorage,
initialSize);
}

public static Object createSentinelIterator(PythonLanguage language, Object callable, Object sentinel) {
return new PSentinelIterator(PythonBuiltinClassType.PSentinelIterator, PythonBuiltinClassType.PSentinelIterator.getInstanceShape(language), callable, sentinel);
}
Expand Down