361 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
361 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
362 methodVisitor.visitInsn(Opcodes.RETURN); |
362 methodVisitor.visitInsn(Opcodes.RETURN); |
363 methodVisitor.visitMaxs(0, 0); |
363 methodVisitor.visitMaxs(0, 0); |
364 }); |
364 }); |
365 |
365 |
366 // MyEvent#commit() - Java event writer |
|
367 updateMethod(METHOD_COMMIT, methodVisitor -> { |
366 updateMethod(METHOD_COMMIT, methodVisitor -> { |
368 // if (!isEnable()) { |
367 // if (!isEnable()) { |
369 // return; |
368 // return; |
370 // } |
369 // } |
371 methodVisitor.visitCode(); |
370 methodVisitor.visitCode(); |
|
371 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
372 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false); |
|
373 Label l0 = new Label(); |
|
374 methodVisitor.visitJumpInsn(Opcodes.IFNE, l0); |
|
375 methodVisitor.visitInsn(Opcodes.RETURN); |
|
376 methodVisitor.visitLabel(l0); |
|
377 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
378 // if (startTime == 0) { |
|
379 // startTime = EventWriter.timestamp(); |
|
380 // } else { |
|
381 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
382 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
383 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
384 methodVisitor.visitInsn(Opcodes.LCMP); |
|
385 Label durationalEvent = new Label(); |
|
386 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent); |
|
387 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
388 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
|
389 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
390 Label commit = new Label(); |
|
391 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit); |
|
392 // if (duration == 0) { |
|
393 // duration = EventWriter.timestamp() - startTime; |
|
394 // } |
|
395 // } |
|
396 methodVisitor.visitLabel(durationalEvent); |
|
397 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
398 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
399 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
400 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
401 methodVisitor.visitInsn(Opcodes.LCMP); |
|
402 methodVisitor.visitJumpInsn(Opcodes.IFNE, commit); |
|
403 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
404 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
|
405 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
406 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
407 methodVisitor.visitInsn(Opcodes.LSUB); |
|
408 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
409 methodVisitor.visitLabel(commit); |
|
410 // if (shouldCommit()) { |
|
411 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
412 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
413 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
|
414 Label end = new Label(); |
|
415 // eventHandler.write(...); |
|
416 // } |
|
417 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end); |
|
418 getEventHandler(methodVisitor); |
|
419 |
|
420 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName); |
|
421 for (FieldInfo fi : fieldInfos) { |
372 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
422 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
373 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false); |
423 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor); |
374 Label l0 = new Label(); |
424 } |
375 methodVisitor.visitJumpInsn(Opcodes.IFNE, l0); |
425 |
376 methodVisitor.visitInsn(Opcodes.RETURN); |
426 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false); |
377 methodVisitor.visitLabel(l0); |
427 methodVisitor.visitLabel(end); |
378 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
428 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
379 // if (startTime == 0) { |
429 methodVisitor.visitInsn(Opcodes.RETURN); |
380 // startTime = EventWriter.timestamp(); |
430 methodVisitor.visitEnd(); |
381 // } else { |
431 }); |
382 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
383 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
384 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
385 methodVisitor.visitInsn(Opcodes.LCMP); |
|
386 Label durationalEvent = new Label(); |
|
387 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent); |
|
388 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
389 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), |
|
390 METHOD_TIME_STAMP.getDescriptor(), false); |
|
391 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
392 Label commit = new Label(); |
|
393 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit); |
|
394 // if (duration == 0) { |
|
395 // duration = EventWriter.timestamp() - startTime; |
|
396 // } |
|
397 // } |
|
398 methodVisitor.visitLabel(durationalEvent); |
|
399 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
400 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
401 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
402 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
403 methodVisitor.visitInsn(Opcodes.LCMP); |
|
404 methodVisitor.visitJumpInsn(Opcodes.IFNE, commit); |
|
405 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
406 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
|
407 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
408 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
409 methodVisitor.visitInsn(Opcodes.LSUB); |
|
410 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
411 methodVisitor.visitLabel(commit); |
|
412 // if (shouldCommit()) { |
|
413 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
414 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
415 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
|
416 Label end = new Label(); |
|
417 // eventHandler.write(...); |
|
418 // } |
|
419 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end); |
|
420 getEventHandler(methodVisitor); |
|
421 |
|
422 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName); |
|
423 for (FieldInfo fi : fieldInfos) { |
|
424 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
425 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor); |
|
426 } |
|
427 |
|
428 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false); |
|
429 methodVisitor.visitLabel(end); |
|
430 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
431 methodVisitor.visitInsn(Opcodes.RETURN); |
|
432 methodVisitor.visitEnd(); |
|
433 }); |
|
434 |
432 |
435 // MyEvent#shouldCommit() |
433 // MyEvent#shouldCommit() |
436 updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> { |
434 updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> { |
437 Label fail = new Label(); |
435 Label fail = new Label(); |
438 if (guardHandlerReference) { |
436 if (guardHandlerReference) { |