Skip to content

Commit 79eb77b

Browse files
committedDec 4, 2024
8345486: Reevaluate the classes in java.lang.classfile.components package
Reviewed-by: mcimadamore, asotona
1 parent f3b4350 commit 79eb77b

33 files changed

+54
-158
lines changed
 

‎make/test/BuildMicrobenchmark.gmk

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ $(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
8989
SRC := $(MICROBENCHMARK_SRC), \
9090
BIN := $(MICROBENCHMARK_CLASSES), \
9191
JAVAC_FLAGS := \
92+
--add-exports java.base/jdk.internal.classfile.components=ALL-UNNAMED \
9293
--add-exports java.base/jdk.internal.classfile.impl=ALL-UNNAMED \
9394
--add-exports java.base/jdk.internal.event=ALL-UNNAMED \
9495
--add-exports java.base/jdk.internal.foreign=ALL-UNNAMED \

‎src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,7 @@
6060
* its state must be reset for each traversal; this will happen automatically if
6161
* the transform is created with {@link ClassTransform#ofStateful(Supplier)} (or
6262
* corresponding methods for other classfile locations.)
63-
* <p>
64-
* Class transformation sample where code transformation is stateful:
65-
* {@snippet lang="java" class="PackageSnippets" region="codeRelabeling"}
66-
* <p>
67-
* Complex class instrumentation sample chaining multiple transformations:
68-
* {@snippet lang="java" class="PackageSnippets" region="classInstrumentation"}
63+
*
6964
* @param <C> the transform type
7065
* @param <E> the element type
7166
* @param <B> the builder type

‎src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java

-84
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,13 @@
2525
package java.lang.classfile.snippets;
2626

2727
import java.lang.classfile.*;
28-
import java.lang.classfile.components.ClassRemapper;
29-
import java.lang.classfile.components.CodeLocalsShifter;
30-
import java.lang.classfile.components.CodeRelabeler;
3128
import java.lang.classfile.instruction.*;
3229
import java.lang.constant.ClassDesc;
3330
import java.lang.constant.ConstantDescs;
3431
import java.lang.constant.MethodTypeDesc;
3532
import java.lang.invoke.MethodHandles;
36-
import java.lang.reflect.AccessFlag;
37-
import java.util.ArrayDeque;
3833
import java.util.HashSet;
39-
import java.util.Map;
4034
import java.util.Set;
41-
import java.util.function.Predicate;
42-
import java.util.stream.Collectors;
4335
import java.util.stream.Stream;
4436

4537
import static java.util.stream.Collectors.toSet;
@@ -326,82 +318,6 @@ void fooToBarUnrolled(ClassModel classModel) {
326318
// @end
327319
}
328320

329-
void codeRelabeling(ClassModel classModel) {
330-
// @start region="codeRelabeling"
331-
byte[] newBytes = ClassFile.of().transformClass(classModel,
332-
ClassTransform.transformingMethodBodies(
333-
CodeTransform.ofStateful(CodeRelabeler::of)));
334-
// @end
335-
}
336-
337-
// @start region="classInstrumentation"
338-
byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicate<MethodModel> instrumentedMethodsFilter) {
339-
var instrumentorCodeMap = instrumentor.methods().stream()
340-
.filter(instrumentedMethodsFilter)
341-
.collect(Collectors.toMap(mm -> mm.methodName().stringValue() + mm.methodType().stringValue(), mm -> mm.code().orElseThrow()));
342-
var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet());
343-
var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet());
344-
var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol()));
345-
return ClassFile.of().transformClass(target,
346-
ClassTransform.transformingMethods(
347-
instrumentedMethodsFilter,
348-
(mb, me) -> {
349-
if (me instanceof CodeModel targetCodeModel) {
350-
var mm = targetCodeModel.parent().get();
351-
//instrumented methods code is taken from instrumentor
352-
mb.transformCode(instrumentorCodeMap.get(mm.methodName().stringValue() + mm.methodType().stringValue()),
353-
//all references to the instrumentor class are remapped to target class
354-
instrumentorClassRemapper.asCodeTransform()
355-
.andThen((codeBuilder, instrumentorCodeElement) -> {
356-
//all invocations of target methods from instrumentor are inlined
357-
if (instrumentorCodeElement instanceof InvokeInstruction inv
358-
&& target.thisClass().asInternalName().equals(inv.owner().asInternalName())
359-
&& mm.methodName().stringValue().equals(inv.name().stringValue())
360-
&& mm.methodType().stringValue().equals(inv.type().stringValue())) {
361-
362-
//store stacked method parameters into locals
363-
var storeStack = new ArrayDeque<StoreInstruction>();
364-
int slot = 0;
365-
if (!mm.flags().has(AccessFlag.STATIC))
366-
storeStack.push(StoreInstruction.of(TypeKind.REFERENCE, slot++));
367-
for (var pt : mm.methodTypeSymbol().parameterList()) {
368-
var tk = TypeKind.from(pt);
369-
storeStack.push(StoreInstruction.of(tk, slot));
370-
slot += tk.slotSize();
371-
}
372-
storeStack.forEach(codeBuilder::with);
373-
374-
//inlined target locals must be shifted based on the actual instrumentor locals
375-
codeBuilder.block(inlinedBlockBuilder -> inlinedBlockBuilder
376-
.transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol())
377-
.andThen(CodeRelabeler.of())
378-
.andThen((innerBuilder, shiftedTargetCode) -> {
379-
//returns must be replaced with jump to the end of the inlined method
380-
if (shiftedTargetCode instanceof ReturnInstruction)
381-
innerBuilder.goto_(inlinedBlockBuilder.breakLabel());
382-
else
383-
innerBuilder.with(shiftedTargetCode);
384-
})));
385-
} else
386-
codeBuilder.with(instrumentorCodeElement);
387-
}));
388-
} else
389-
mb.with(me);
390-
})
391-
.andThen(ClassTransform.endHandler(clb ->
392-
//remaining instrumentor fields and methods are injected at the end
393-
clb.transform(instrumentor,
394-
ClassTransform.dropping(cle ->
395-
!(cle instanceof FieldModel fm
396-
&& !targetFieldNames.contains(fm.fieldName().stringValue()))
397-
&& !(cle instanceof MethodModel mm
398-
&& !ConstantDescs.INIT_NAME.equals(mm.methodName().stringValue())
399-
&& !targetMethods.contains(mm.methodName().stringValue() + mm.methodType().stringValue())))
400-
//and instrumentor class references remapped to target class
401-
.andThen(instrumentorClassRemapper)))));
402-
}
403-
// @end
404-
405321
void resolverExample() {
406322
// @start region="lookup-class-hierarchy-resolver"
407323
MethodHandles.Lookup lookup = MethodHandles.lookup(); // @replace regex="MethodHandles\.lookup\(\)" replacement="..."

‎src/java.base/share/classes/java/lang/classfile/components/ClassPrinter.java ‎src/java.base/share/classes/jdk/internal/classfile/components/ClassPrinter.java

+1-13
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package java.lang.classfile.components;
25+
package jdk.internal.classfile.components;
2626

2727
import java.lang.classfile.ClassModel;
2828
import java.lang.classfile.CodeModel;
@@ -58,8 +58,6 @@
5858
* <p>
5959
* Another use case for {@link ClassPrinter} is to simplify writing of automated tests:
6060
* {@snippet lang="java" class="PackageSnippets" region="printNodesInTest"}
61-
*
62-
* @since 24
6361
*/
6462
public final class ClassPrinter {
6563

@@ -68,8 +66,6 @@ private ClassPrinter() {
6866

6967
/**
7068
* Level of detail to print or export.
71-
*
72-
* @since 24
7369
*/
7470
public enum Verbosity {
7571

@@ -102,8 +98,6 @@ public enum Verbosity {
10298

10399
/**
104100
* Named, traversable, and printable node parent.
105-
*
106-
* @since 24
107101
*/
108102
public sealed interface Node {
109103

@@ -146,8 +140,6 @@ default void toYaml(Consumer<String> out) {
146140

147141
/**
148142
* A leaf node holding single printable value.
149-
*
150-
* @since 24
151143
*/
152144
public sealed interface LeafNode extends Node
153145
permits ClassPrinterImpl.LeafNodeImpl {
@@ -161,8 +153,6 @@ public sealed interface LeafNode extends Node
161153

162154
/**
163155
* A tree node holding {@link List} of nested nodes.
164-
*
165-
* @since 24
166156
*/
167157
public sealed interface ListNode extends Node, List<Node>
168158
permits ClassPrinterImpl.ListNodeImpl {
@@ -172,8 +162,6 @@ public sealed interface ListNode extends Node, List<Node>
172162
* A tree node holding {@link Map} of nested nodes.
173163
* <p>
174164
* Each {@link Map.Entry#getKey()} == {@link Map.Entry#getValue()}.{@link #name()}.
175-
*
176-
* @since 24
177165
*/
178166
public sealed interface MapNode extends Node, Map<ConstantDesc, Node>
179167
permits ClassPrinterImpl.MapNodeImpl {

‎src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java ‎src/java.base/share/classes/jdk/internal/classfile/components/ClassRemapper.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package java.lang.classfile.components;
25+
package jdk.internal.classfile.components;
2626

2727
import java.lang.classfile.ClassFile;
2828
import java.lang.classfile.ClassModel;
@@ -53,8 +53,6 @@
5353
* <p>
5454
* Arrays of reference types are always decomposed, mapped as the base reference
5555
* types and composed back to arrays.
56-
*
57-
* @since 24
5856
*/
5957
public sealed interface ClassRemapper extends ClassTransform permits ClassRemapperImpl {
6058

‎src/java.base/share/classes/java/lang/classfile/components/CodeLocalsShifter.java ‎src/java.base/share/classes/jdk/internal/classfile/components/CodeLocalsShifter.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package java.lang.classfile.components;
25+
package jdk.internal.classfile.components;
2626

2727
import java.lang.classfile.AccessFlags;
2828
import java.lang.classfile.CodeTransform;
@@ -37,8 +37,6 @@
3737
* newly allocated positions to avoid conflicts during code injection.
3838
* Locals pointing to the receiver or to method arguments slots are never shifted.
3939
* All locals pointing beyond the method arguments are re-indexed in order of appearance.
40-
*
41-
* @since 24
4240
*/
4341
public sealed interface CodeLocalsShifter extends CodeTransform permits CodeLocalsShifterImpl {
4442

‎src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java ‎src/java.base/share/classes/jdk/internal/classfile/components/CodeRelabeler.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package java.lang.classfile.components;
25+
package jdk.internal.classfile.components;
2626

2727
import java.lang.classfile.CodeBuilder;
2828
import java.lang.classfile.CodeTransform;
@@ -44,8 +44,6 @@
4444
* Primary purpose of CodeRelabeler is for repeated injections of the same code blocks.
4545
* Repeated injection of the same code block must be relabeled, so each instance of
4646
* {@link java.lang.classfile.Label} is bound in the target bytecode exactly once.
47-
*
48-
* @since 24
4947
*/
5048
public sealed interface CodeRelabeler extends CodeTransform permits CodeRelabelerImpl {
5149

‎src/java.base/share/classes/java/lang/classfile/components/CodeStackTracker.java ‎src/java.base/share/classes/jdk/internal/classfile/components/CodeStackTracker.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package java.lang.classfile.components;
25+
package jdk.internal.classfile.components;
2626

2727
import java.lang.classfile.CodeTransform;
2828
import java.lang.classfile.Label;
@@ -49,8 +49,6 @@
4949
* int maxStack = stackTracker.maxStackSize().get();
5050
* });
5151
* }
52-
*
53-
* @since 24
5452
*/
5553
public sealed interface CodeStackTracker extends CodeTransform permits CodeStackTrackerImpl {
5654

‎src/java.base/share/classes/java/lang/classfile/components/package-info.java ‎src/java.base/share/classes/jdk/internal/classfile/components/package-info.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@
110110
* CodeLocalsShifter} and {@link CodeRelabeler} into fully functional class
111111
* instrumenting transformation:
112112
* {@snippet lang="java" class="PackageSnippets" region="classInstrumentation"}
113-
*
114-
* @since 24
115113
*/
116-
package java.lang.classfile.components;
114+
package jdk.internal.classfile.components;
117115

‎src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java ‎src/java.base/share/classes/jdk/internal/classfile/components/snippet-files/PackageSnippets.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
package java.lang.classfile.components.snippets;
2626

2727
import java.lang.classfile.*;
28-
import java.lang.classfile.components.ClassPrinter;
29-
import java.lang.classfile.components.ClassRemapper;
30-
import java.lang.classfile.components.CodeLocalsShifter;
31-
import java.lang.classfile.components.CodeRelabeler;
28+
import jdk.internal.classfile.components.ClassPrinter;
29+
import jdk.internal.classfile.components.ClassRemapper;
30+
import jdk.internal.classfile.components.CodeLocalsShifter;
31+
import jdk.internal.classfile.components.CodeRelabeler;
3232
import java.lang.classfile.instruction.InvokeInstruction;
3333
import java.lang.classfile.instruction.ReturnInstruction;
3434
import java.lang.classfile.instruction.StoreInstruction;

‎src/java.base/share/classes/jdk/internal/classfile/impl/ClassPrinterImpl.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
import java.lang.classfile.attribute.StackMapFrameInfo.SimpleVerificationTypeInfo;
3232
import java.lang.classfile.attribute.StackMapFrameInfo.UninitializedVerificationTypeInfo;
3333
import java.lang.classfile.attribute.StackMapFrameInfo.VerificationTypeInfo;
34-
import java.lang.classfile.components.ClassPrinter.LeafNode;
35-
import java.lang.classfile.components.ClassPrinter.ListNode;
36-
import java.lang.classfile.components.ClassPrinter.MapNode;
37-
import java.lang.classfile.components.ClassPrinter.Node;
38-
import java.lang.classfile.components.ClassPrinter.Verbosity;
34+
import jdk.internal.classfile.components.ClassPrinter.LeafNode;
35+
import jdk.internal.classfile.components.ClassPrinter.ListNode;
36+
import jdk.internal.classfile.components.ClassPrinter.MapNode;
37+
import jdk.internal.classfile.components.ClassPrinter.Node;
38+
import jdk.internal.classfile.components.ClassPrinter.Verbosity;
3939
import java.lang.classfile.constantpool.*;
4040
import java.lang.classfile.instruction.*;
4141
import java.lang.constant.ConstantDesc;

‎src/java.base/share/classes/jdk/internal/classfile/impl/ClassRemapperImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import java.lang.classfile.*;
2828
import java.lang.classfile.attribute.*;
29-
import java.lang.classfile.components.ClassRemapper;
29+
import jdk.internal.classfile.components.ClassRemapper;
3030
import java.lang.classfile.constantpool.Utf8Entry;
3131
import java.lang.classfile.instruction.ConstantInstruction.LoadConstantInstruction;
3232
import java.lang.classfile.instruction.*;

‎src/java.base/share/classes/jdk/internal/classfile/impl/CodeLocalsShifterImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import java.lang.classfile.CodeElement;
2929
import java.lang.classfile.Signature;
3030
import java.lang.classfile.TypeKind;
31-
import java.lang.classfile.components.CodeLocalsShifter;
31+
import jdk.internal.classfile.components.CodeLocalsShifter;
3232
import java.lang.classfile.instruction.IncrementInstruction;
3333
import java.lang.classfile.instruction.LoadInstruction;
3434
import java.lang.classfile.instruction.LocalVariable;

‎src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import java.lang.classfile.CodeBuilder;
2828
import java.lang.classfile.CodeElement;
2929
import java.lang.classfile.Label;
30-
import java.lang.classfile.components.CodeRelabeler;
30+
import jdk.internal.classfile.components.CodeRelabeler;
3131
import java.lang.classfile.instruction.*;
3232
import java.util.function.BiFunction;
3333

‎src/java.base/share/classes/jdk/internal/classfile/impl/CodeStackTrackerImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import java.lang.classfile.Label;
3030
import java.lang.classfile.Opcode;
3131
import java.lang.classfile.TypeKind;
32-
import java.lang.classfile.components.CodeStackTracker;
32+
import jdk.internal.classfile.components.CodeStackTracker;
3333
import java.lang.classfile.instruction.*;
3434
import java.util.*;
3535
import java.util.function.Consumer;

‎src/java.base/share/classes/jdk/internal/classfile/impl/Util.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import java.lang.classfile.*;
2828
import java.lang.classfile.attribute.CodeAttribute;
29-
import java.lang.classfile.components.ClassPrinter;
29+
import jdk.internal.classfile.components.ClassPrinter;
3030
import java.lang.classfile.constantpool.ClassEntry;
3131
import java.lang.classfile.constantpool.ModuleEntry;
3232
import java.lang.classfile.constantpool.PoolEntry;

‎src/java.base/share/classes/jdk/internal/classfile/impl/verifier/VerifierImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import java.lang.classfile.ClassHierarchyResolver;
2828
import java.lang.classfile.ClassModel;
29-
import java.lang.classfile.components.ClassPrinter;
29+
import jdk.internal.classfile.components.ClassPrinter;
3030
import java.util.ArrayList;
3131
import java.util.Collections;
3232
import java.util.List;

‎src/java.base/share/classes/module-info.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
exports java.lang.annotation;
8282
exports java.lang.classfile;
8383
exports java.lang.classfile.attribute;
84-
exports java.lang.classfile.components;
8584
exports java.lang.classfile.constantpool;
8685
exports java.lang.classfile.instruction;
8786
exports java.lang.constant;
@@ -177,6 +176,8 @@
177176
jdk.net,
178177
jdk.sctp,
179178
jdk.crypto.cryptoki;
179+
exports jdk.internal.classfile.components to
180+
jdk.jfr;
180181
exports jdk.internal.foreign to
181182
jdk.incubator.vector;
182183
exports jdk.internal.event to

‎src/jdk.jfr/share/classes/jdk/jfr/internal/util/Bytecode.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import java.lang.classfile.CodeBuilder;
3636
import java.lang.classfile.ClassModel;
3737
import java.lang.classfile.ClassFile;
38-
import java.lang.classfile.components.ClassPrinter;
38+
import jdk.internal.classfile.components.ClassPrinter;
3939

4040
/**
4141
* Helper class when working with bytecode.

0 commit comments

Comments
 (0)
Please sign in to comment.