On Wed, 10 Jul 2024 12:53:46 GMT, Alan Bateman <al...@openjdk.org> wrote:

>> Volker Simonis has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Addressed @AlanBateman's suggestions and updated copyright year
>
> src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
>  line 158:
> 
>> 156:  *
>> 157:  * <P>
>> 158:  * Note the term <i>class file</i> is used as defined in section {@jvms 
>> 4} The
> 
> The existing sentence uses "section" but I assume it should be "Chapter".

Correct, it was section 3.1 before but now it's chapter 4. Fixed.

> src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
>  line 167:
> 
>> 165:  * same time required during the transformation process as this can 
>> lead to class
>> 166:  * circularity or linkage errors. Using bytecode transformation 
>> libraries which depend
>> 167:  * on core JDK class can increase the risk of such errors.
> 
> It's probably impossible to create a BCI library that don't depend on JDK 
> core classes so maybe it would be better to drop the second sentence.

Fixed.

> src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
>  line 179:
> 
>> 177:  * This means that a {@link LinkageError} triggered during 
>> transformation of
>> 178:  * {@code C} in a class {@code D} not directly related to {@code C} can 
>> repeatedly
>> 179:  * occur later in arbitrary user code which uses {@code D}.
> 
> This paragraph looks okay but I can't help thinking we should have something 
> in normative text to reference that specifies the reentrancy behavior.  Maybe 
> I missed it but I thought we have something in the API docs on this.

I haven't found anything either. The only specification-relevant mentioning of 
the issue I found is in the [JVMTI 
Specification](https://docs.oracle.com/en/java/javase/21/docs/specs/jvmti.html#bci)
 referenced at the beginning of the PR:

> Care must be taken to avoid perturbing dependencies, especially when 
> instrumenting core classes. 

The example that follows describes an infinite recursion when instrumenting the 
the `j.l.Object()` constructor.

I think the exact reentrancy behavior isn't specified anywhere. Not even the 
exact that should be thrown in such a case is specified (see [8164165: JVM 
throws incorrect exception when ClassFileTransformer.transform() triggers class 
loading of class already being 
loaded](https://bugs.openjdk.org/browse/JDK-8164165) for a discussion of 
different scenarios).

I think the real problem is that the JVMS predates the JVMTI specification and 
the interaction between instrumentation and class loading isn't clearly 
defined. I think it might even be possible to treat class loading errors during 
transformation differently, such that they will not lead to a permanent 
resolution error for the corresponding constant pool entries. I know that this 
will violate the current section ยง 5.4.3 Resolution 
(https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3) of 
the JVM specification which mandates that "if an attempt by the Java Virtual 
Machine to resolve a symbolic reference fails because an error is thrown that 
is an instance of LinkageError (or a subclass), then subsequent attempts to 
resolve the reference always fail with the same error that was thrown as a 
result of the initial resolution attempt". But as I wrote, that predates JVMTI 
and when JVMTI was added, we missed the opportunity to specify its exact impact 
on class loading an
 d resolution.
 
 But all this is a much bigger discussion. Maybe we should open another issue 
for it?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/20011#discussion_r1672636821
PR Review Comment: https://git.openjdk.org/jdk/pull/20011#discussion_r1672637843
PR Review Comment: https://git.openjdk.org/jdk/pull/20011#discussion_r1672663335

Reply via email to