8338543: ClassBuilder withMethod builders should cache the method type symbol

Reviewed-by: asotona
This commit is contained in:
Chen Liang 2024-08-20 05:43:04 +00:00
parent 55851a312b
commit 68d1f5c33b
3 changed files with 19 additions and 4 deletions

View file

@ -276,10 +276,7 @@ public sealed interface ClassBuilder
MethodTypeDesc descriptor, MethodTypeDesc descriptor,
int methodFlags, int methodFlags,
Consumer<? super CodeBuilder> handler) { Consumer<? super CodeBuilder> handler) {
return withMethodBody(constantPool().utf8Entry(name), return withMethod(name, descriptor, methodFlags, mb -> mb.withCode(handler));
constantPool().utf8Entry(descriptor),
methodFlags,
handler);
} }
/** /**

View file

@ -24,6 +24,7 @@
*/ */
package jdk.internal.classfile.impl; package jdk.internal.classfile.impl;
import java.lang.constant.MethodTypeDesc;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.lang.classfile.*; import java.lang.classfile.*;
@ -78,6 +79,15 @@ public final class ChainedClassBuilder
return this; return this;
} }
@Override
public ClassBuilder withMethod(String name, MethodTypeDesc descriptor, int flags, Consumer<? super MethodBuilder> handler) {
var mb = new BufferedMethodBuilder(terminal.constantPool, terminal.context,
constantPool().utf8Entry(name), constantPool().utf8Entry(descriptor), flags, null);
mb.mDesc = descriptor;
consumer.accept(mb.run(handler).toModel());
return this;
}
@Override @Override
public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) { public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) {
BufferedMethodBuilder builder = new BufferedMethodBuilder(terminal.constantPool, terminal.context, BufferedMethodBuilder builder = new BufferedMethodBuilder(terminal.constantPool, terminal.context,

View file

@ -26,6 +26,7 @@
package jdk.internal.classfile.impl; package jdk.internal.classfile.impl;
import java.lang.constant.ConstantDescs; import java.lang.constant.ConstantDescs;
import java.lang.constant.MethodTypeDesc;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -106,6 +107,13 @@ public final class DirectClassBuilder
.run(handler)); .run(handler));
} }
@Override
public ClassBuilder withMethod(String name, MethodTypeDesc descriptor, int flags, Consumer<? super MethodBuilder> handler) {
var method = new DirectMethodBuilder(constantPool, context, constantPool.utf8Entry(name), constantPool.utf8Entry(descriptor), flags, null);
method.mDesc = descriptor;
return withMethod(method.run(handler));
}
@Override @Override
public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) { public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) {
DirectMethodBuilder builder = new DirectMethodBuilder(constantPool, context, method.methodName(), DirectMethodBuilder builder = new DirectMethodBuilder(constantPool, context, method.methodName(),