Skip to content

Commit 8b48667

Browse files
committed
feat(asm): Clean up DelayCertainInsMethodVisitor
1 parent 7b5edc0 commit 8b48667

File tree

2 files changed

+37
-29
lines changed

2 files changed

+37
-29
lines changed

dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,40 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5-
import java.util.function.Function;
65
import net.bytebuddy.jar.asm.AnnotationVisitor;
76
import net.bytebuddy.jar.asm.Handle;
87
import net.bytebuddy.jar.asm.Label;
98
import net.bytebuddy.jar.asm.MethodVisitor;
109
import net.bytebuddy.jar.asm.Opcodes;
1110
import net.bytebuddy.jar.asm.TypePath;
1211

12+
/**
13+
* This method visitor delays the following instructions:
14+
*
15+
* <ul>
16+
* <li>Local variable instruction: {@code ALOAD},</li>
17+
* <li>field instructions: {@code GETSTATIC}, {@code GETFIELD}</li>
18+
* <li>method instructions: {@code INVOKEVIRTUAL}</li>
19+
* </ul>
20+
*
21+
* They can be queried using {@link #transferVisitations()} and manually commited using {@link #commitVisitations(List)}.
22+
*/
1323
public class DelayCertainInsMethodVisitor extends MethodVisitor {
14-
private final List<Function> heldVisitations = new ArrayList();
24+
private final List<Runnable> heldVisitations = new ArrayList<>();
1525

1626
public DelayCertainInsMethodVisitor(int api, MethodVisitor methodVisitor) {
1727
super(api, methodVisitor);
1828
}
1929

20-
public void commitVisitations(List<Function> heldVisitations) {
21-
for (Function fun : heldVisitations) {
22-
fun.apply(null);
30+
public void commitVisitations(List<Runnable> heldVisitations) {
31+
for (Runnable r : heldVisitations) {
32+
r.run();
2333
}
2434
heldVisitations.clear();
2535
}
2636

27-
public List<Function> transferVisitations() {
28-
ArrayList<Function> copy = new ArrayList<>(this.heldVisitations);
37+
public List<Runnable> transferVisitations() {
38+
ArrayList<Runnable> copy = new ArrayList<>(this.heldVisitations);
2939
this.heldVisitations.clear();
3040
return copy;
3141
}
@@ -207,7 +217,7 @@ public void visitEnd() {
207217
super.visitEnd();
208218
}
209219

210-
public class InvokeDynamicInsn implements Function {
220+
public class InvokeDynamicInsn implements Runnable {
211221
public final String name;
212222
public final String descriptor;
213223
public final Handle bootstrapMethodHandle;
@@ -225,13 +235,12 @@ public InvokeDynamicInsn(
225235
}
226236

227237
@Override
228-
public Object apply(Object input) {
238+
public void run() {
229239
mv.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
230-
return null;
231240
}
232241
}
233242

234-
public class VirtualMethodInsn implements Function {
243+
public class VirtualMethodInsn implements Runnable {
235244
public final int opcode;
236245
public final String owner;
237246
public final String name;
@@ -248,13 +257,12 @@ public VirtualMethodInsn(
248257
}
249258

250259
@Override
251-
public Object apply(Object input) {
260+
public void run() {
252261
mv.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
253-
return null;
254262
}
255263
}
256264

257-
public class GetStaticFieldInsn implements Function {
265+
public class GetStaticFieldInsn implements Runnable {
258266
public final int opcode;
259267
public final String owner;
260268
public final String name;
@@ -268,13 +276,12 @@ public GetStaticFieldInsn(int opcode, String owner, String name, String descript
268276
}
269277

270278
@Override
271-
public Object apply(Object input) {
279+
public void run() {
272280
mv.visitFieldInsn(opcode, owner, name, descriptor);
273-
return null;
274281
}
275282
}
276283

277-
public class GetFieldInsn implements Function {
284+
public class GetFieldInsn implements Runnable {
278285
public final int opcode;
279286
public final String owner;
280287
public final String name;
@@ -288,13 +295,12 @@ public GetFieldInsn(int opcode, String owner, String name, String descriptor) {
288295
}
289296

290297
@Override
291-
public Object apply(Object input) {
298+
public void run() {
292299
mv.visitFieldInsn(opcode, owner, name, descriptor);
293-
return null;
294300
}
295301
}
296302

297-
public class ALoadVarInsn implements Function {
303+
public class ALoadVarInsn implements Runnable {
298304
public final int opcode;
299305
public final int varIndex;
300306

@@ -304,9 +310,8 @@ public ALoadVarInsn(int opcode, int varIndex) {
304310
}
305311

306312
@Override
307-
public Object apply(Object input) {
313+
public void run() {
308314
mv.visitVarInsn(opcode, varIndex);
309-
return null;
310315
}
311316
}
312317
}

dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void visitMethodInsn(
141141
&& descriptor.equals("(Lorg/eclipse/jetty/server/HttpChannel;)V")) {
142142
debug("handle bytecode found");
143143
DelayCertainInsMethodVisitor mv = delayVisitorDelegate();
144-
List<Function> savedVisitations = mv.transferVisitations();
144+
List<Runnable> savedVisitations = mv.transferVisitations();
145145
/*
146146
* Saved visitations should be for:
147147
*
@@ -156,8 +156,9 @@ public void visitMethodInsn(
156156
return;
157157
}
158158

159+
// Declare label to insert after Server.handle() call
159160
Label afterHandle = new Label();
160-
161+
// Inject blocking helper call
161162
super.visitVarInsn(Opcodes.ALOAD, 0);
162163
super.visitMethodInsn(
163164
Opcodes.INVOKEVIRTUAL,
@@ -181,10 +182,12 @@ public void visitMethodInsn(
181182
+ Type.getDescriptor(Context.class)
182183
+ ")Z",
183184
false);
185+
// Inject jump to after Server.handle() call if blocked
184186
super.visitJumpInsn(Opcodes.IFNE, afterHandle);
185-
187+
// Inject getServer() and Server.handle() calls
186188
mv.commitVisitations(savedVisitations);
187189
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
190+
// Inject label after Server.handle() call to jump here when blocked
188191
super.visitLabel(afterHandle);
189192
super.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
190193
debug("handle bytecode injected");
@@ -200,7 +203,7 @@ public void visitMethodInsn(
200203
"(Ljakarta/servlet/DispatcherType;Lorg/eclipse/jetty/server/HttpChannel$Dispatchable;)V"))) {
201204

202205
DelayCertainInsMethodVisitor mv = delayVisitorDelegate();
203-
List<Function> savedVisitations = mv.transferVisitations();
206+
List<Runnable> savedVisitations = mv.transferVisitations();
204207

205208
// check that we've queued up what we're supposed to
206209
if (!checkDispatchMethodState(savedVisitations)) {
@@ -237,7 +240,7 @@ public void visitMethodInsn(
237240
super.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
238241
// dispatch with a Dispatchable created from JettyBlockingHelper::block
239242
// first set up the first two arguments to dispatch (this and DispatcherType.REQUEST)
240-
List<Function> loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2));
243+
List<Runnable> loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2));
241244
mv.commitVisitations(loadThisAndEnum);
242245
// set up the arguments to the method underlying the lambda (Request, Response,
243246
// RequestBlockingAction, AgentSpan)
@@ -309,7 +312,7 @@ public void visitMethodInsn(
309312
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
310313
}
311314

312-
private boolean checkDispatchMethodState(final List<Function> savedVisitations) {
315+
private boolean checkDispatchMethodState(final List<Runnable> savedVisitations) {
313316
if (savedVisitations.size() != 4) {
314317
return false;
315318
}
@@ -329,7 +332,7 @@ private boolean checkDispatchMethodState(final List<Function> savedVisitations)
329332
return false;
330333
}
331334

332-
final Function last = savedVisitations.get(3);
335+
final Runnable last = savedVisitations.get(3);
333336
// jetty < 11.16.0
334337
// this.dispatch(DispatcherType.REQUEST, () -> { ... });
335338
if (last instanceof DelayCertainInsMethodVisitor.InvokeDynamicInsn) {

0 commit comments

Comments
 (0)