365 }); |
365 }); |
366 |
366 |
367 // MyEvent#commit() - Java event writer |
367 // MyEvent#commit() - Java event writer |
368 if (streamingCommit) { |
368 if (streamingCommit) { |
369 updateMethod(METHOD_COMMIT, methodVisitor -> { |
369 updateMethod(METHOD_COMMIT, methodVisitor -> { |
370 // if (shouldCommit()) { |
|
371 methodVisitor.visitCode(); |
370 methodVisitor.visitCode(); |
372 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
371 // Labels |
373 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
372 Label enabled = new Label(); |
374 Label end = new Label(); |
373 Label end = new Label(); |
375 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end); |
374 Label durationEvent = new Label(); |
376 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
375 Label writeToHandler = new Label(); |
377 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
376 Label timestampOnCommit = new Label(); |
378 // startTime = EventHandler.timestamp() - duration; |
377 // if (!isEnable()) { |
379 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), |
378 // return; |
380 METHOD_TIME_STAMP.getDescriptor(), false); |
379 // } |
|
380 methodVisitor.visitCode(); |
|
381 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
382 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false); |
|
383 methodVisitor.visitJumpInsn(Opcodes.IFNE, enabled); |
|
384 methodVisitor.visitInsn(Opcodes.RETURN); |
|
385 methodVisitor.visitLabel(enabled); |
|
386 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
387 |
|
388 // if (startTime == 0) { |
|
389 // startTime = EventWriter.timestamp(); |
|
390 // } else { |
|
391 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
392 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
393 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
394 methodVisitor.visitInsn(Opcodes.LCMP); |
|
395 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationEvent); |
|
396 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
397 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
|
398 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
399 methodVisitor.visitJumpInsn(Opcodes.GOTO, writeToHandler); |
|
400 |
|
401 // new |
|
402 // if (duration == 0) { |
|
403 methodVisitor.visitLabel(durationEvent); |
|
404 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
405 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
406 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
407 methodVisitor.visitInsn(Opcodes.LCONST_0); |
|
408 methodVisitor.visitInsn(Opcodes.LCMP); |
|
409 methodVisitor.visitJumpInsn(Opcodes.IFNE, timestampOnCommit); |
|
410 |
|
411 // startTime = EventWriter.timestamp() - duration; |
|
412 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
413 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
381 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
414 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
382 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
415 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
383 methodVisitor.visitInsn(Opcodes.LSUB); |
416 methodVisitor.visitInsn(Opcodes.LSUB); |
384 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
417 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
418 methodVisitor.visitJumpInsn(Opcodes.GOTO, writeToHandler); |
|
419 |
|
420 // duration = EventWriter.timestamp() -timestamp |
|
421 // } |
|
422 methodVisitor.visitLabel(timestampOnCommit); |
|
423 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
424 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
425 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
|
426 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
427 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
|
428 methodVisitor.visitInsn(Opcodes.LSUB); |
|
429 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
|
430 |
|
431 // if (shouldCommit()) { |
|
432 methodVisitor.visitLabel(writeToHandler); |
|
433 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
434 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
|
435 methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
|
436 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end); |
|
437 // |
385 // eventHandlerX.write(...); |
438 // eventHandlerX.write(...); |
386 getEventHandler(methodVisitor); |
439 getEventHandler(methodVisitor); |
387 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName); |
440 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName); |
388 for (FieldInfo fi : fieldInfos) { |
441 for (FieldInfo fi : fieldInfos) { |
389 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
442 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
390 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor); |
443 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor); |
391 } |
444 } |
392 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false); |
445 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false); |
393 // } |
446 // } |
394 methodVisitor.visitLabel(end); |
447 methodVisitor.visitLabel(end); |
395 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
|
396 methodVisitor.visitInsn(Opcodes.RETURN); |
448 methodVisitor.visitInsn(Opcodes.RETURN); |
397 methodVisitor.visitEnd(); |
449 methodVisitor.visitEnd(); |
398 }); |
450 }); |
399 } else { |
451 } |
|
452 |
|
453 if (!streamingCommit) { |
400 updateMethod(METHOD_COMMIT, methodVisitor -> { |
454 updateMethod(METHOD_COMMIT, methodVisitor -> { |
401 // if (!isEnable()) { |
455 // if (!isEnable()) { |
402 // return; |
456 // return; |
403 // } |
457 // } |
404 methodVisitor.visitCode(); |
458 methodVisitor.visitCode(); |
417 methodVisitor.visitInsn(Opcodes.LCONST_0); |
471 methodVisitor.visitInsn(Opcodes.LCONST_0); |
418 methodVisitor.visitInsn(Opcodes.LCMP); |
472 methodVisitor.visitInsn(Opcodes.LCMP); |
419 Label durationalEvent = new Label(); |
473 Label durationalEvent = new Label(); |
420 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent); |
474 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent); |
421 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
475 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
422 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), |
476 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
423 METHOD_TIME_STAMP.getDescriptor(), false); |
|
424 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
477 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
425 Label commit = new Label(); |
478 Label commit = new Label(); |
426 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit); |
479 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit); |
427 // if (duration == 0) { |
480 // if (duration == 0) { |
428 // duration = EventWriter.timestamp() - startTime; |
481 // duration = EventWriter.timestamp() - startTime; |
429 // } |
482 // } |
430 // } |
483 // } |
431 methodVisitor.visitLabel(durationalEvent); |
484 methodVisitor.visitLabel(durationalEvent); |
432 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
485 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
433 // methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
486 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
434 // methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
487 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
435 // methodVisitor.visitInsn(Opcodes.LCONST_0); |
488 methodVisitor.visitInsn(Opcodes.LCONST_0); |
436 // methodVisitor.visitInsn(Opcodes.LCMP); |
489 methodVisitor.visitInsn(Opcodes.LCMP); |
437 // methodVisitor.visitJumpInsn(Opcodes.IFNE, commit); |
490 methodVisitor.visitJumpInsn(Opcodes.IFNE, commit); |
438 // methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
491 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
439 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
492 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false); |
440 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
493 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
441 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
494 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J"); |
442 methodVisitor.visitInsn(Opcodes.LSUB); |
495 methodVisitor.visitInsn(Opcodes.LSUB); |
443 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
496 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J"); |
444 methodVisitor.visitLabel(commit); |
497 methodVisitor.visitLabel(commit); |
445 // if (shouldCommit()) { |
498 // if (shouldCommit()) { |
446 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
499 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
447 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
500 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0); |
448 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
501 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false); |
449 Label end = new Label(); |
502 Label end = new Label(); |