diff --git a/TracerOnJavassist/src/tracer/ITraceGenerator.java b/TracerOnJavassist/src/tracer/ITraceGenerator.java new file mode 100644 index 0000000..870078d --- /dev/null +++ b/TracerOnJavassist/src/tracer/ITraceGenerator.java @@ -0,0 +1,34 @@ +package tracer; + +import javassist.CtBehavior; +import javassist.CtClass; + +/** + * �g���[�X�o�͂��s�����s��������̃t�H�[�}�b�g�ˑ����� + * @author Nitta + * + */ +public interface ITraceGenerator { + + public abstract String generateReplaceStatementsForFieldSet( + String targetClass, String targetObject, + String argClass, String argObject, + String threadId, String timeStamp); + + public abstract String generateReplaceStatementsForFieldGet(String thisClass, String thisObject, + String targetClass, String targetObject, + String returnedClass, String returnedObject, + String threadId, String timeStamp); + + public abstract String generateInsertBeforeStatements( + CtBehavior m, String methodSignature, + String thisClass, String thisObject, CtClass[] parameterClasses, + String threadId, String timeStamp); + + public abstract String generateInsertAfterStatements( + CtClass cls, CtBehavior m, + String thisObject, + String returnedClass, String returnedObject, + String threadId, String timeStamp, + boolean isCallerSideInstrumentation); +} diff --git a/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java b/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java index e60398d..4741f28 100644 --- a/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java +++ b/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java @@ -8,65 +8,61 @@ import javassist.NotFoundException; /** - * �g���[�X�o�͗p�̎��s���𐶐�����N���X�i�o�̓t�H�[�}�b�g�ւ̈ˑ��������B������Ă���j + * �g���[�X�o�͂��s�����s���𐶐�����N���X�i�t�H�[�}�b�g�ˑ�������ITraceGenerator�Ɉڏ��j * * @author Nitta * */ public class OutputStatementsGenerator { - static final String LINE_AND_THREAD = "\":Line \" + (tracer.Tracer.lineNo++) + \":ThreadNo \" + Thread.currentThread().getId()"; - static final String LINE = "\":Line \" + (tracer.Tracer.lineNo++) + \":\""; - - static String generateReplaceStatementsForFieldSet(CtClass cc) { - String declaredClassName = cc.getName(); - return "{$proceed($$); " + - "if ($0 != null) {" + // target - "tracer.MyPrintStream.print(\"set:\" + $0.getClass().getName() + \":\" + System.identityHashCode($0) + \":\"); " + - "} else {" + - "tracer.MyPrintStream.print(\"set:" + declaredClassName + ":0:\"); " + - "} " + - "if ($1 != null) {" + // o[0] - "tracer.MyPrintStream.println($1.getClass().getName() + \":\" + System.identityHashCode($1) + " + OutputStatementsGenerator.LINE_AND_THREAD + ");" + - "} else {" + - "tracer.MyPrintStream.println(\"---:0\" + " + OutputStatementsGenerator.LINE_AND_THREAD + ");" + - "}" + "}"; + private ITraceGenerator generator; + + public OutputStatementsGenerator(ITraceGenerator generator) { + this.generator = generator; } - static String generateReplaceStatementsForFieldGet(CtClass cc, CtBehavior m) { - String declaredClassName = cc.getName(); - String thisOutput = ""; + public String generateReplaceStatementsForFieldSet(CtClass cc) { + String targetClass = "(($0 != null)?$0.getClass().getName():\"" + cc.getName() + "\")"; + String targetObject = "(($0 != null)?System.identityHashCode($0):0)"; + String argClass = "(($1 != null)?$1.getClass().getName():\"---\")"; + String argObject = "(($1 != null)?System.identityHashCode($1):0)"; + String threadId = "Thread.currentThread().getId()"; + String timeStamp = "System.nanoTime()"; + return generator.generateReplaceStatementsForFieldSet(targetClass, targetObject, argClass, argObject, threadId, timeStamp); + } + + public String generateReplaceStatementsForFieldGet(CtClass cc, CtBehavior m) { + String thisClass; + String thisObject; if ((m.getModifiers() & Modifier.STATIC) == 0 && m instanceof CtMethod) { - thisOutput = "tracer.MyPrintStream.print(\"get:\" + this.getClass().getName() + \":\" + System.identityHashCode(this) + \":\"); "; + thisClass = "this.getClass().getName()"; + thisObject = "System.identityHashCode(this)"; } else { // static���\�b�h���R���X�g���N�^�̏ꍇ - thisOutput = "tracer.MyPrintStream.print(\"get:" + declaredClassName + ":0:\"); "; + thisClass = "\"" + cc.getName() + "\""; + thisObject = "\"0\""; } - return "{$_ = $proceed(); " + - thisOutput + - "if ($0 != null) {" + // target - "tracer.MyPrintStream.print($0.getClass().getName() + \":\" + System.identityHashCode($0) + \":\"); " + - "} else {" + - "tracer.MyPrintStream.print(\"---:0:\"); " + - "} " + - "if ($_ != null) {" + // o - "tracer.MyPrintStream.println($_.getClass().getName() + \":\" + System.identityHashCode($_) + " + LINE_AND_THREAD + ");" + - "} else {" + - "tracer.MyPrintStream.println(\"---:0\" + " + LINE_AND_THREAD + ");" + - "} " + "}"; + String targetClass = "(($0 != null)?$0.getClass().getName():\"---\")"; + String targetObject = "(($0 != null)?System.identityHashCode($0):0)"; + String returnedClass = "(($_ != null)?$_.getClass().getName():\"---\")"; + String returnedObject = "(($_ != null)?System.identityHashCode($_):0)"; + String threadId = "Thread.currentThread().getId()"; + String timeStamp = "System.nanoTime()"; + return generator.generateReplaceStatementsForFieldGet(thisClass, thisObject, targetClass, targetObject, returnedClass, returnedObject, threadId, timeStamp); + } + + + public String generateReplaceStatementsForCall(CtClass cls, CtBehavior m) throws NotFoundException { + return "{" + generateInsertBeforeStatements(cls, m, true) + " $_ = $proceed($$); " + generateInsertAfterStatements(cls, m, true) + "}"; } - static String generateReplaceStatementsForCall(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + OutputStatementsGenerator.generateInsertBeforeStatements(cls, m, true) + " $_ = $proceed($$); " + OutputStatementsGenerator.generateInsertAfterStatements(cls, m, true) + "}"; + public String generateInsertBeforeStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { + return "{" + generateInsertBeforeStatements(cls, m, false) + "}"; } - static String generateInsertBeforeStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + OutputStatementsGenerator.generateInsertBeforeStatements(cls, m, false) + "}"; + public String generateInsertAfterStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { + return "{" + generateInsertAfterStatements(cls, m, false) + "}"; } - - static String generateInsertAfterStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + OutputStatementsGenerator.generateInsertAfterStatements(cls, m, false) + "}"; - } - + /** * �g���[�X�o�͗p�̖��ߗ�𐶐����� * @param cls �ΏۃN���X @@ -75,28 +71,9 @@ * @return * @throws NotFoundException */ - static String generateInsertBeforeStatements(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { + private String generateInsertBeforeStatements(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { String declaredClassName = cls.getName(); - String delimiter = "tracer.MyPrintStream.println(\"Args:\" + "; CtClass parameterClasses[] = m.getParameterTypes(); - int p = 0; - - String newOutput = ""; - String methodOutput = ""; - String classOutput = ""; - String argsOutput = ""; - for (CtClass c : parameterClasses) { - if (!c.isPrimitive()) { - argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + System.identityHashCode($" + (p + 1) + ")"; - } else { - argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + $" + (p + 1); - } - p++; - delimiter = " + \":\" + "; - } - if (p > 0) { - argsOutput += " + " + LINE_AND_THREAD + ");"; - } String modifiers = ""; if ((m.getModifiers() & Modifier.PUBLIC) != 0) { modifiers = "public "; @@ -114,114 +91,93 @@ if ((m.getModifiers() & Modifier.SYNCHRONIZED) != 0) { modifiers += "synchronized "; } - String longName = null; + String thisClass; + String thisObject; + String methodSignature = null; if ((m.getModifiers() & Modifier.STATIC) != 0) { // static���\�b�h�̏ꍇ - longName = modifiers + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� - methodOutput = "tracer.MyPrintStream.println(\"Method " + declaredClassName + "," + longName - + ":\" + 0 + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; - classOutput = "tracer.MyPrintStream.println(\"Class " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; + methodSignature = "\"" + modifiers + ((CtMethod)m).getReturnType().getName() + " " + m.getLongName().replace('$', '.') + "\""; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + thisClass = "\"" + declaredClassName + "\""; + thisObject = "\"0\""; } else if (m instanceof CtConstructor) { // �R���X�g���N�^�̏ꍇ - longName = modifiers + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� - newOutput = "tracer.MyPrintStream.println(\"New " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; - methodOutput = "tracer.MyPrintStream.println(\"Method " + declaredClassName + "," + longName - + ":\" + 0 + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; - classOutput = "tracer.MyPrintStream.println(\"Class " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; + methodSignature = "\"" + modifiers + m.getLongName().replace('$', '.') + "\""; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + thisClass = "\"" + declaredClassName + "\""; + thisObject = "\"0\""; } else { - // �ʏ�̃��\�b�h�̏ꍇ - longName = modifiers + ((CtMethod)m).getReturnType().getName() + " " + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + // �ʏ탁�\�b�h�̏ꍇ + methodSignature = "\"" + modifiers + ((CtMethod)m).getReturnType().getName() + " " + m.getLongName().replace('$', '.') + "\""; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� if (!isCallerSideInstrumentation) { // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) - methodOutput = "tracer.MyPrintStream.println(\"Method \" + this.getClass().getName() + \"," + longName - + ":\" + System.identityHashCode(this) + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; - classOutput = "tracer.MyPrintStream.println(\"Class \" + this.getClass().getName() + \":\" + System.identityHashCode(this) + " + LINE_AND_THREAD + ");"; + thisClass = "this.getClass().getName()"; + thisObject = "System.identityHashCode(this)"; } else { - // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) - methodOutput = "tracer.MyPrintStream.println(\"Method \" + $0.getClass().getName() + \"," + longName - + ":\" + System.identityHashCode($0) + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; - classOutput = "tracer.MyPrintStream.println(\"Class \" + $0.getClass().getName() + \":\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) + thisClass = "$0.getClass().getName()"; + thisObject = "System.identityHashCode($0)"; } } - - return newOutput + methodOutput + classOutput + argsOutput; - } - - static String generateInsertAfterStatements(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { - String returnOutput = null; - String shortName = null; - if ((m.getModifiers() & Modifier.STATIC) != 0) { - // static���\�b�h�̏ꍇ - shortName = cls.getSimpleName().replace('$', '.') + "." + m.getName() + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� - String invocationType = null; - if (!isCallerSideInstrumentation) { - // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) - invocationType = "execution"; - } else { - // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) - invocationType = "call"; - } - if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { - returnOutput = "if ($_ != null) {" + - "tracer.MyPrintStream.print(\"Return " + invocationType + "(" + shortName + "):\" + $_.getClass().getName() + \":\" + System.identityHashCode($_) + \":\");" + - "} else {" + - "tracer.MyPrintStream.print(\"Return " + invocationType + "(" + shortName + "):void:0:\");" + - "} " + - "tracer.MyPrintStream.println(\"0\" + " + LINE_AND_THREAD + ");"; - } else { - returnOutput = "tracer.MyPrintStream.print(\"Return " + invocationType + "(" + shortName + "):" + ((CtMethod)m).getReturnType().getName() + ":\" + $_ + \":\");" + - "tracer.MyPrintStream.println(\"0\" + " + LINE_AND_THREAD + ");"; - } - } else if (m instanceof CtConstructor) { - // �R���X�g���N�^�̏ꍇ - shortName = m.getName().replace('$', '.') + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� - if (!isCallerSideInstrumentation) { - // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) - returnOutput = "tracer.MyPrintStream.print(\"Return initialization(" + shortName + "):\" + $0.getClass().getName() + \":\" + System.identityHashCode($0) + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; - } else { - // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�������̓f�t�H���g�R���X�g���N�^�̌ďo��) - returnOutput = "if ($_ != null) {" + - "tracer.MyPrintStream.print(\"Return initialization(" + shortName + "):\" + $_.getClass().getName() + \":\" + System.identityHashCode($_) + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($_) + " + LINE_AND_THREAD + ");" + - "} else {" + - // �e�R���X�g���N�^�ďo���̏ꍇ(�߂�l�͂Ȃ�) - "tracer.MyPrintStream.print(\"Return initialization(" + shortName + "):\" + $0.getClass().getName() + \":\" + System.identityHashCode($0) + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");" + - "}"; - } - } else { - // �ʏ�̃��\�b�h�̏ꍇ - shortName = cls.getSimpleName().replace('$', '.') + "." + m.getName() + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� - if (!isCallerSideInstrumentation) { - // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) - if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { - returnOutput = "if ($_ != null) {" + - "tracer.MyPrintStream.print(\"Return execution(" + shortName + "):\" + $_.getClass().getName() + \":\" + System.identityHashCode($_) + \":\");" + - "} else {" + - "tracer.MyPrintStream.print(\"Return execution(" + shortName + "):void:0:\");" + - "} " + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode(this) + " + LINE_AND_THREAD + ");"; - } else { - returnOutput = "tracer.MyPrintStream.print(\"Return execution(" + shortName + "):" + ((CtMethod)m).getReturnType().getName() + ":\" + $_ + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode(this) + " + LINE_AND_THREAD + ");"; - } - } else { - // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) - if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { - returnOutput = "if ($_ != null) {" + - "tracer.MyPrintStream.print(\"Return call(" + shortName + "):\" + $_.getClass().getName() + \":\" + System.identityHashCode($_) + \":\");" + - "} else {" + - "tracer.MyPrintStream.print(\"Return call(" + shortName + "):void:0:\");" + - "} " + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; - } else { - returnOutput = "tracer.MyPrintStream.print(\"Return execution(" + shortName + "):" + ((CtMethod)m).getReturnType().getName() + ":\" + $_ + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; - } - } - } - return returnOutput; + String threadId = "Thread.currentThread().getId()"; + String timeStamp = "System.nanoTime()"; + return generator.generateInsertBeforeStatements(m, methodSignature, thisClass, thisObject, parameterClasses, threadId, timeStamp); } + private String generateInsertAfterStatements(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { + String returnedClass; + String returnedObject; + String thisObject; + if ((m.getModifiers() & Modifier.STATIC) != 0) { + // static���\�b�h�̏ꍇ + if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { + returnedClass = "(($_ != null)?$_.getClass().getName():\"void\")"; + returnedObject = "(($_ != null)?System.identityHashCode($_):0)"; + thisObject = "\"0\""; + } else { + returnedClass = "\"" + ((CtMethod)m).getReturnType().getName() +"\""; + returnedObject = "$_"; + thisObject = "\"0\""; + } + } else if (m instanceof CtConstructor) { + // �R���X�g���N�^�̏ꍇ + if (!isCallerSideInstrumentation) { + // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) + returnedClass = "$0.getClass().getName()"; + returnedObject = "System.identityHashCode($0)"; + thisObject = "System.identityHashCode($0)"; + } else { + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�������̓f�t�H���g�R���X�g���N�^�̌ďo���A�܂��͐e�R���X�g���N�^�̌ďo��) + returnedClass = "(($_ != null)?$_.getClass().getName():$0.getClass().getName())"; + returnedObject = "(($_ != null)?System.identityHashCode($_):System.identityHashCode($0))"; + thisObject = "(($_ != null)?System.identityHashCode($_):System.identityHashCode($0))"; + } + } else { + // �ʏ�̃��\�b�h�̏ꍇ + if (!isCallerSideInstrumentation) { + // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) + if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { + returnedClass = "(($_ != null)?$_.getClass().getName():\"void\")"; + returnedObject = "(($_ != null)?System.identityHashCode($_):0)"; + thisObject = "System.identityHashCode(this)"; + } else { + returnedClass = "\"" + ((CtMethod)m).getReturnType().getName() +"\""; + returnedObject = "$_"; + thisObject = "System.identityHashCode(this)"; + } + } else { + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) + if (!((CtMethod)m).getReturnType().isPrimitive() || ((CtMethod)m).getReturnType() == CtClass.voidType) { + returnedClass = "(($_ != null)?$_.getClass().getName():\"void\")"; + returnedObject = "(($_ != null)?System.identityHashCode($_):0)"; + thisObject = "System.identityHashCode($0)"; + } else { + returnedClass = "\"" + ((CtMethod)m).getReturnType().getName() +"\""; + returnedObject = "$_"; + thisObject = "System.identityHashCode($0)"; + } + } + } + String threadId = "Thread.currentThread().getId()"; + String timeStamp = "System.nanoTime()"; + return generator.generateInsertAfterStatements(cls, m, thisObject, returnedClass, returnedObject, threadId, timeStamp, isCallerSideInstrumentation); + } } diff --git a/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java b/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java new file mode 100644 index 0000000..05a87ad --- /dev/null +++ b/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java @@ -0,0 +1,98 @@ +package tracer; + +import javassist.CtBehavior; +import javassist.CtClass; +import javassist.CtConstructor; + +public class PlainTextTraceGenerator implements ITraceGenerator { + public static final String LINE_AND_THREAD = "\":Line \" + (tracer.Tracer.lineNo++) + \":ThreadNo \" + "; + public static final String LINE = "\":Line \" + (tracer.Tracer.lineNo++) + \":\""; + + @Override + public String generateReplaceStatementsForFieldSet(String targetClass, String targetObject, String argClass, String argObject, String threadId, String timeStamp) { + String output = "{$proceed($$); " + + "tracer.MyPrintStream.println(\"set:\" + " + targetClass + " + \":\" + " + targetObject + " + \":\" + " + + argClass + " + \":\" + " + argObject + " + " + LINE_AND_THREAD + threadId + ");}"; + System.out.println(output); + return output; +// return "{$proceed($$); " + +// "tracer.MyPrintStream.print(\"set:\" + " + targetClass + " + \":\" + " + targetObject + " + \":\" + " + +// argClass + " + \":\" + " + argObject + " + " + LINE_AND_THREAD + threadId + ");}"; + } + + @Override + public String generateReplaceStatementsForFieldGet(String thisClass, String thisObject, String targetClass, String targetObject, + String returnedClass, String returnedObject, String threadId, String timeStamp) { + String output = "{$_ = $proceed(); " + + "tracer.MyPrintStream.println(\"get:\" + " + thisClass + " + \":\" + " + thisObject + " + \":\" + " + + targetClass + " + \":\" + " + targetObject + " + \":\" + " + + returnedClass + " + \":\" + " + returnedObject + " + " + LINE_AND_THREAD + threadId + ");}"; + System.out.println(output); + return output; +// return "{$_ = $proceed(); " + +// "tracer.MyPrintStream.print(\"get:\" + " + thisClass + " + \":\" + " + thisObject + " + \":\" + " + +// targetClass + " + \":\" + " + targetObject + " + \":\" + " + +// returnedClass + " + \":\" + " + returnedObject + " + \":\" + " + LINE_AND_THREAD + threadId + ");}"; + } + + @Override + public String generateInsertBeforeStatements(CtBehavior m, String methodSignature, + String thisClass, String thisObject, CtClass[] parameterClasses, String threadId, String timeStamp) { + String newOutput = ""; + String methodOutput = ""; + String classOutput = ""; + String argsOutput = ""; + String delimiter = "tracer.MyPrintStream.println(\"Args:\" + "; + // �����̏o�� + int p = 0; + for (CtClass c : parameterClasses) { + if (!c.isPrimitive()) { + argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + System.identityHashCode($" + (p + 1) + ")"; + } else { + argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + $" + (p + 1); + } + p++; + delimiter = " + \":\" + "; + } + if (p > 0) { + argsOutput += " + " + LINE_AND_THREAD + threadId + ");"; + } + if (m instanceof CtConstructor) { + // �R���X�g���N�^�̏ꍇ + newOutput = "tracer.MyPrintStream.println(\"New \" + " + thisClass + " + \":\" + " + thisObject + " + " + LINE_AND_THREAD + threadId + ");"; + } + methodOutput = "tracer.MyPrintStream.println(\"Method \" + " + thisClass + " + \",\" + " + methodSignature + + " + \":\" + " + thisObject + " + " + LINE + " + " + timeStamp + " + \":ThreadNo \" + " + threadId + ");"; + classOutput = "tracer.MyPrintStream.println(\"Class \" + " + thisClass + " + \":\" + " + thisObject + " + " + LINE_AND_THREAD + threadId + ");"; + + System.out.println(newOutput + methodOutput + classOutput + argsOutput); + return newOutput + methodOutput + classOutput + argsOutput; + } + + @Override + public String generateInsertAfterStatements(CtClass cls, CtBehavior m, + String thisObject, String returnedClass, String returnedObject, String threadId, String timeStamp, boolean isCallerSideInstrumentation) { + String shortName = null; + String invocationType = null; + if (m instanceof CtConstructor) { + // �R���X�g���N�^�̏ꍇ + shortName = m.getName().replace('$', '.') + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + invocationType = "initialization"; + } else { + // �ʏ�̃��\�b�h��������static���\�b�h�̏ꍇ + shortName = cls.getSimpleName().replace('$', '.') + "." + m.getName() + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + if (!isCallerSideInstrumentation) { + // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) + invocationType = "execution"; + } else { + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) + invocationType = "call"; + } + } + + String returnOutput = "tracer.MyPrintStream.print(\"Return " + invocationType + "(" + shortName + "):\" + " + returnedClass + " + \":\" + " + returnedObject + " + \":\");" + + "tracer.MyPrintStream.println(\"\" + " + thisObject + " + " + LINE_AND_THREAD + threadId + ");"; + System.out.println(returnOutput); + return returnOutput; + } +} diff --git a/TracerOnJavassist/src/tracer/Tracer.java b/TracerOnJavassist/src/tracer/Tracer.java index 3e42622..33bd9b5 100644 --- a/TracerOnJavassist/src/tracer/Tracer.java +++ b/TracerOnJavassist/src/tracer/Tracer.java @@ -36,8 +36,10 @@ public static int lineNo = 1; private static final String STANDARD_CLASSES = "java.util.ListIterator|java.util.Iterator|java.util.List|java.util.Vector|java.util.ArrayList|java.util.Stack|java.util.Map|java.util.HashMap|java.util.Set|java.util.HashSet|java.util.Hashtable|java.util.LinkedList|java.lang.Thread"; private static final String CONCRETE_STANDARD_CLASSES = "java.util.Vector|java.util.ArrayList|java.util.Stack |java.util.HashMap|java.util.HashSet|java.util.Hashtable|java.util.LinkedList|java.lang.Thread"; + private static OutputStatementsGenerator outputStatementsGenerator = null; public static void main(String[] args) { + outputStatementsGenerator = new OutputStatementsGenerator(new PlainTextTraceGenerator()); // �����ŏo�̓t�H�[�}�b�g���w�肷�� String packageName = "constructor"; // �w�肵���p�b�P�[�W�����̑S�N���X�ɃC���X�g�D�������e�[�V�������s�� ClassLoader loader = Thread.currentThread().getContextClassLoader(); URL resource = loader.getResource(packageName); @@ -89,11 +91,11 @@ public void edit(FieldAccess f) throws CannotCompileException { if (f.isReader()) { if (!f.getFieldName().contains("$")) { // AspectJ�ł� final local �ϐ�����̃Q�b�g�͖��������̂ŁA����ɍ��킹�ď��O���� - f.replace(OutputStatementsGenerator.generateReplaceStatementsForFieldGet(cc, m)); + f.replace(outputStatementsGenerator.generateReplaceStatementsForFieldGet(cc, m)); } } else { if (!f.getFieldName().contains("$")) { // ���̏������Ȃ��ƂȂ���������i�����t�B�[���h?�ւ̃Z�b�g�������āA������E���ė����Ă�?�j - f.replace(OutputStatementsGenerator.generateReplaceStatementsForFieldSet(cc)); + f.replace(outputStatementsGenerator.generateReplaceStatementsForFieldSet(cc)); } } } @@ -101,7 +103,7 @@ try { CtMethod m = c.getMethod(); if (m.getDeclaringClass().getName().matches(STANDARD_CLASSES)) { - c.replace(OutputStatementsGenerator.generateReplaceStatementsForCall(m.getDeclaringClass(), m)); + c.replace(outputStatementsGenerator.generateReplaceStatementsForCall(m.getDeclaringClass(), m)); } } catch (NotFoundException e) { e.printStackTrace(); @@ -111,7 +113,7 @@ try { CtConstructor m = n.getConstructor(); if (m.getDeclaringClass().getName().matches(CONCRETE_STANDARD_CLASSES)) { - n.replace(OutputStatementsGenerator.generateReplaceStatementsForCall(m.getDeclaringClass(), m)); + n.replace(outputStatementsGenerator.generateReplaceStatementsForCall(m.getDeclaringClass(), m)); } } catch (NotFoundException e) { e.printStackTrace(); @@ -132,13 +134,13 @@ // ���\�b�h�p�̏o�͕��𐶐����� if (!m.isEmpty()) { // ���\�b�h�̎��s�O��ɏo�͕���}������ - m.insertBefore(OutputStatementsGenerator.generateInsertBeforeStatementsForMethodBody(cc, m)); - m.insertAfter(OutputStatementsGenerator.generateInsertAfterStatementsForMethodBody(cc, m)); + m.insertBefore(outputStatementsGenerator.generateInsertBeforeStatementsForMethodBody(cc, m)); + m.insertAfter(outputStatementsGenerator.generateInsertAfterStatementsForMethodBody(cc, m)); } else { // ���\�b�h�{�̂���̂Ƃ��̓R���X�g���N�^�̏ꍇ�̂�(=�f�t�H���g�R���X�g���N�^)�{�̂ɏo�͕���ݒ肷�� if (m instanceof CtConstructor) { - m.setBody(OutputStatementsGenerator.generateInsertAfterStatementsForMethodBody(cc, m)); - m.insertBefore(OutputStatementsGenerator.generateInsertBeforeStatementsForMethodBody(cc, m)); + m.setBody(outputStatementsGenerator.generateInsertAfterStatementsForMethodBody(cc, m)); + m.insertBefore(outputStatementsGenerator.generateInsertBeforeStatementsForMethodBody(cc, m)); } }