[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-serviceability-dev
Subject: Integrated: 8267555: Fix class file version during redefinition after 8238048
From: Volker Simonis <simonis () openjdk ! java ! net>
Date: 2021-05-28 8:36:10
Message-ID: EdqsL71aym5FO6eB5lO9UOIBRNg5MPM6QcUdd8yWASE=.8c24c252-8e22-47eb-bdc3-872cab2cba3f () github ! com
[Download RAW message or body]
On Fri, 21 May 2021 19:20:29 GMT, Volker Simonis <simonis@openjdk.org> wrote:
> In jdk15, [JDK-8238048](https://bugs.openjdk.java.net/browse/JDK-8238048) moved the \
> class file versions from the `InstanceKlass` into the `ConstantPool` and introduced \
> a new method `ConstantPool::copy_fields(const ConstantPool* orig)` which copies not \
> only the `source_file_name_index`, `generic_signature_index` and \
> `has_dynamic_constant` from `orig` to the current `ConstantPool` object, but also \
> the minor and major class file version.
> This new `copy_fields()` method is now called during class redefinition (in \
> `VM_RedefineClasses::merge_cp_and_rewrite()`) at places where previously only the \
> `has_dynamic_constant` attribute was copied from the old to the new version of the \
> class. If the new version of the class has a different class file version than the \
> previous one, this different class file version will now be overwritten with the \
> class file version of the previous, original class.
> In `VM_RedefineClasses::load_new_class_versions()`, after \
> `VM_RedefineClasses::merge_cp_and_rewrite()` has completed, we do another \
> verification step to check the results of constant pool merging (in jdk15 this was \
> controlled by `VerifyMergedCPBytecodes` which was on by default, in jdk16 and later \
> this extra verification step only happens in debug builds). If the new class \
> instance uses features which are not available for the class version of the \
> previous class, this verification step will fail.
> The solution is simple. Don't overwrite the class file version of the new class any \
> more. This also requires reintroducing the update of the class file version for the \
> newly redefined class in `VM_RedefineClasses::redefine_single_class()` like this \
> was done before [JDK-8238048](https://bugs.openjdk.java.net/browse/JDK-8238048).
> I'm just not sure about the additional new field updates for \
> `source_file_name_index` and `generic_signature_index` in \
> `ConstantPool::copy_fields()` which were not done before \
> [JDK-8238048](https://bugs.openjdk.java.net/browse/JDK-8238048). Do we want to \
> preserve these attributes from the original class and write them into the new \
> redefined version? If yes, the new code would be correct and we could remove the \
> following code from `VM_RedefineClasses::redefine_single_class()` because that was \
> already done in `ConstantPool::copy_fields()`:
> // Copy the "source file name" attribute from new class version
> the_class->set_source_file_name_index(
> scratch_class->source_file_name_index());
>
> Otherwise the new would be wrong in the same sense like it was wrong for the class \
> file versions. The differences of between the class file versions and \
> `source_file_name_index`/`generic_signature_index` is that the former attributes \
> are mandatory and therefor always available in the new class version while the \
> latter ones are optional. So maybe we should only copy them from the original to \
> the new class if they are not present there already? It currently seems like \
> there's no optimal solution for these attributes?
This pull request has now been integrated.
Changeset: 1d2c7ac3
Author: Volker Simonis <simonis@openjdk.org>
URL: https://git.openjdk.java.net/jdk/commit/1d2c7ac3f7492b335757bf0fd3f6ca3941c5fc72
Stats: 208 lines in 5 files changed: 204 ins; 1 del; 3 mod
8267555: Fix class file version during redefinition after 8238048
Reviewed-by: coleenp, sspitsyn
-------------
PR: https://git.openjdk.java.net/jdk/pull/4149
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic