119 private final String eventHandlerXInternalName; |
119 private final String eventHandlerXInternalName; |
120 private final String eventName; |
120 private final String eventName; |
121 private final boolean untypedEventHandler; |
121 private final boolean untypedEventHandler; |
122 private boolean guardHandlerReference; |
122 private boolean guardHandlerReference; |
123 private Class<?> superClass; |
123 private Class<?> superClass; |
|
124 private final static boolean streamingCommit = !SecuritySupport.getBooleanProperty("jfr.instrument.streaming"); |
124 |
125 |
125 EventInstrumentation(Class<?> superClass, byte[] bytes, long id) { |
126 EventInstrumentation(Class<?> superClass, byte[] bytes, long id) { |
126 this.superClass = superClass; |
127 this.superClass = superClass; |
127 this.classNode = createClassNode(bytes); |
128 this.classNode = createClassNode(bytes); |
128 this.settingInfos = buildSettingInfos(superClass, classNode); |
129 this.settingInfos = buildSettingInfos(superClass, classNode); |
362 methodVisitor.visitInsn(Opcodes.RETURN); |
363 methodVisitor.visitInsn(Opcodes.RETURN); |
363 methodVisitor.visitMaxs(0, 0); |
364 methodVisitor.visitMaxs(0, 0); |
364 }); |
365 }); |
365 |
366 |
366 // MyEvent#commit() - Java event writer |
367 // MyEvent#commit() - Java event writer |
367 updateMethod(METHOD_COMMIT, methodVisitor -> { |
368 if (streamingCommit) { |
|
369 updateMethod(METHOD_COMMIT, methodVisitor -> { |
|
370 // if (shouldCommit()) { |
|
371 methodVisitor.visitCode(); |
|
372 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
373 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
|
374 Label end = new Label(); |
|
375 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end); |
|
376 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
377 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
378 // startTime = EventHandler.timestamp() - duration; |
|
379 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), |
|
380 METHOD_TIME_STAMP.getDescriptor(), false); |
|
381 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
382 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
383 methodVisitor.visitInsn(Opcodes.LSUB); |
|
384 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
385 // eventHandlerX.write(...); |
|
386 getEventHandler(methodVisitor); |
|
387 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName); |
|
388 for (FieldInfo fi : fieldInfos) { |
|
389 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
390 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor); |
|
391 } |
|
392 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false); |
|
393 // } |
|
394 methodVisitor.visitLabel(end); |
|
395 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
396 methodVisitor.visitInsn(Opcodes.RETURN); |
|
397 methodVisitor.visitEnd(); |
|
398 }); |
|
399 } else { |
|
400 updateMethod(METHOD_COMMIT, methodVisitor -> { |
368 // if (!isEnable()) { |
401 // if (!isEnable()) { |
369 // return; |
402 // return; |
370 // } |
403 // } |
371 methodVisitor.visitCode(); |
404 methodVisitor.visitCode(); |
372 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
405 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
429 methodVisitor.visitLabel(end); |
462 methodVisitor.visitLabel(end); |
430 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
463 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
431 methodVisitor.visitInsn(Opcodes.RETURN); |
464 methodVisitor.visitInsn(Opcodes.RETURN); |
432 methodVisitor.visitEnd(); |
465 methodVisitor.visitEnd(); |
433 }); |
466 }); |
|
467 } |
434 |
468 |
435 // MyEvent#shouldCommit() |
469 // MyEvent#shouldCommit() |
436 updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> { |
470 updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> { |
437 Label fail = new Label(); |
471 Label fail = new Label(); |
438 if (guardHandlerReference) { |
472 if (guardHandlerReference) { |