CSR creation request for JDK-8283237
-
liangchenblue at gmail.com
Sun Mar 20 19:03:56 UTC 2022
Hello,
I hereby request the creation of a CSR request for bug 8283237
<https://bugs.openjdk.java.net/browse/JDK-8283237> by a jdk project author
or committer, with the following contents:
CSR of: JDK-8283237
Component: core-libs
Subcomponent: java.lang.invoke
Compatibility Kind: source
Compatibility risk: minimal
Compatibility Risk Description: Given all constructors of
java.lang.invoke.CallSite were package-private, no application or non-JDK
code is expected to break, as they could not create direct subclasses to
CallSite before.
Interface Kind: Java API
Scope: SE
Description:
## Summary
`java.lang.invoke.CallSite` will be marked as a sealed class; its direct
subclasses, `ConstantCallSite`, `VolatileCallSite`, and `MutableCallSite`,
will be marked as non-sealed classes. The documentation of `CallSite` is
updated to mention sealed and non-sealed status of these classes.
## Problem
`CallSite` is not intended to be directly subclassed, but it may not be
straightforward, especially when only the bytecode of the JDK API is
available. Moreover, it may be a bit hard to navigate to the three
immediate subclasses.
## Solution
Marking `CallSite` as `sealed` and listing the permitted subclasses (in the
order they appear in the documentation) makes the API design more obvious,
and the documentation of `CallSite` is updated to reflect the seal change.
`ConstantCallSite`, `VolatileCallSite`, and `MutableCallSite` will be
marked as `non-sealed`, as they are extendable by design.
## Specification
```patch
diff --git a/src/java.base/share/classes/java/lang/invoke/CallSite.java
b/src/java.base/share/classes/java/lang/invoke/CallSite.java
index e159e235f30..172d33f65b6 100644
--- a/src/java.base/share/classes/java/lang/invoke/CallSite.java
+++ b/src/java.base/share/classes/java/lang/invoke/CallSite.java
@@ -40,9 +40,9 @@ import jdk.internal.vm.annotation.Stable;
* In any case, it may be invoked through an associated method handle
* called its {@linkplain #dynamicInvoker dynamic invoker}.
* <p>
- * {@code CallSite} is an abstract class which does not allow
+ * {@code CallSite} is an abstract sealed class which does not allow
* direct subclassing by users. It has three immediate,
- * concrete subclasses that may be either instantiated or subclassed.
+ * concrete non-sealed subclasses that may be either instantiated or
subclassed.
* <ul>
* <li>If a mutable target is not required, an {@code invokedynamic}
instruction
* may be permanently bound by means of a {@linkplain ConstantCallSite
constant call site}.
@@ -85,7 +85,7 @@ private static CallSite
bootstrapDynamic(MethodHandles.Lookup caller, String nam
* @since 1.7
*/
public
-abstract class CallSite {
+abstract sealed class CallSite permits ConstantCallSite, MutableCallSite,
VolatileCallSite {
// The actual payload of this call site.
// Can be modified using {@link
MethodHandleNatives#setCallSiteTargetNormal} or {@link
MethodHandleNatives#setCallSiteTargetVolatile}.
diff --git
a/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java
b/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java
index e2e3f478a3c..833cd5b117a 100644
--- a/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java
+++ b/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java
@@ -35,7 +35,7 @@ import jdk.internal.vm.annotation.Stable;
* @author John Rose, JSR 292 EG
* @since 1.7
*/
-public class ConstantCallSite extends CallSite {
+public non-sealed class ConstantCallSite extends CallSite {
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
@Stable // should NOT be constant folded during instance
initialization (isFrozen == false)
diff --git
a/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java
b/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java
index c16483d02ae..c100657df6b 100644
--- a/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java
+++ b/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java
@@ -83,7 +83,7 @@ assertEquals("Wilma, dear?", (String)
worker2.invokeExact());
* @author John Rose, JSR 292 EG
* @since 1.7
*/
-public class MutableCallSite extends CallSite {
+public non-sealed class MutableCallSite extends CallSite {
/**
* Creates a blank call site object with the given method type.
* The initial target is set to a method handle of the given type
diff --git
a/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java
b/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java
index 742fa23737d..ea068ff07e6 100644
--- a/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java
+++ b/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java
@@ -42,7 +42,7 @@ package java.lang.invoke;
* @author John Rose, JSR 292 EG
* @since 1.7
*/
-public class VolatileCallSite extends CallSite {
+public non-sealed class VolatileCallSite extends CallSite {
/**
* Creates a call site with a volatile binding to its target.
* The initial target is set to a method handle
```
More information about the core-libs-dev
mailing list