On Tue, 22 Apr 2025 18:23:52 GMT, John R Rose <jr...@openjdk.org> wrote:

>> Chen Liang has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Refine validation and defensive copying
>
> src/java.base/share/classes/jdk/internal/vm/annotation/IntrinsicCandidate.java
>  line 58:
> 
>> 56:  * The HotSpot VM checks, when loading a class, the consistency of 
>> recognized
>> 57:  * methods and {@code @IntrinsicCandidate} annotations, unless the {@code
>> 58:  * CheckIntrinsics} VM flag is disabled.
> 
> <p>
> Even if an intrinsic is available the VM is not obligated to use it.  For 
> example,
> the bytecodes of an intrinsic method may be executed by lower tiers of VM
> execution, while higher tiers may replace the bytecodes with specialized
> assembly code and/or compiler IR.  Therefore, intrinsic implementors must
> ensure that non-bytecode execution has (in an application-specific sense)
> the same results as execution of the actual Java code.  Also, persons not
> directly involved with maintaining the Java libraries or the HotSpot VM can
> usually ignore the {@code @IntrinsicCandidate} annotation, when reasoning
> about the actions of the method.  Such persons must not assume, however,
> that checks for nulls, out-of-bounds indexes, and wrong types will be 
> performed
> by the intrinsic, even though normal Java execution always performs such 
> checks.

And for arrays, a footnote might be appropriate:


<p>
For some highly optimized algorithms, it may be impractical to ensure that array
data is read or written only once by the intrinsic.  If the caller of the 
intrinsic
cannot guarantee that such array data is unshared, then the caller must also
document the effects of race conditions on it.  (Such a race occurs when another
thread writes the array data during the execution of the intrinsic.)  For 
example,
the documentation can simply say that the result is undefined if a race happens.


And maybe, after that, something more about type safety:


<p>
In no case may any intrinsic be allowed to perform an operation that fails to be
type safe.  It must not indirect a null pointer; it must not access a field or 
method
on an object which does not possess that field or method; it must not access
an element of an array not actually present in the array; and it must not
manipulate managed references in a way that prevents the GC from managing
them.  The caller of the intrinsic is fully responsible for preventing every 
kind
of type safety violation, in the case (the common case) that the intrinsic 
itself
does not itself somehow prevent the violation.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24777#discussion_r2054665206

Reply via email to