RFR: 8271525: ResourceHashtableBase::iterate() should not declared as const
Coleen Phillimore
coleenp at openjdk.java.net
Fri Jul 30 14:36:42 UTC 2021
On Fri, 30 Jul 2021 09:26:00 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:
>> `ResourceHashtableBase::iterate()` is declared `const`, but it can actually change the contents of the table. The same is true for `ResourceHashtableBase::get()`, which returns a non-`const` pointer to the value, allowing the caller to modify it.
>>
>> We should declare these two functions as non-`const`. This will also remove a lot of ugly `const_cast<>` code.
>>
>> The `iterate()` API is tightened such that the `do_entry()` function can modify the `value` but not the `key`.
>
> I think this is not an improvement, sorry. Now, a number of methods became non-const, including `iterate`, and that non-constness propagates. `iterate` itself does not change the table, and it can be reasonably called from const contexts. There are actually a number of callers which arguably should be const but aren't (e.g. `ClassLoaderStatsClosure::print()`.
>
> I think a better approach would be to have both const and non-const versions, e.g. for `bucket_at()`:
>
>
> Node** bucket_at(unsigned index) ...
> const Node* const * bucket_at(unsigned index) const ...
>
>
> This way, the compiler chooses the const version in const code, giving you the benefit of a read-only V*, and in non-const code you get access to the innards of V*. No awkward const casts needed.
>
> Above code makes Coleen's new unlink() from https://github.com/openjdk/jdk/pull/4938 compile in non-const form.
>
> Note how `ResourceHashTable::lookup_node()` already follows this pattern. You deleted the non-const version, but it made sense.
>
> Same with `::get`:
>
>
> const V* get(K const& key) const;
> V* get(K const& key);
>
>
> Making the Key references const is fine though.
>
> ..Thomas
@tstuefe I was not paying attention when C++ added overloading based on constness of return type so that's an interesting change, but also, does this get rid of the monstrosity:
return const_cast<Node const**>(
const_cast<ResourceHashtableBase*>(this)->lookup_node(hash, key));
?
-------------
PR: https://git.openjdk.java.net/jdk/pull/4942
More information about the hotspot-dev
mailing list