diff --git a/TracerOnJavassist/src/test/A.java b/TracerOnJavassist/src/test/A.java new file mode 100644 index 0000000..5373aab --- /dev/null +++ b/TracerOnJavassist/src/test/A.java @@ -0,0 +1,5 @@ +package test; + +public abstract class A { + public abstract A m(A a); +} diff --git a/TracerOnJavassist/src/test/B.java b/TracerOnJavassist/src/test/B.java new file mode 100644 index 0000000..5badfba --- /dev/null +++ b/TracerOnJavassist/src/test/B.java @@ -0,0 +1,10 @@ +package test; + +public class B extends A { + + @Override + public A m(A a) { + return a; + } + +} diff --git a/TracerOnJavassist/src/test/Main.java b/TracerOnJavassist/src/test/Main.java new file mode 100644 index 0000000..df9ea7d --- /dev/null +++ b/TracerOnJavassist/src/test/Main.java @@ -0,0 +1,13 @@ +package test; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + B b = new B(); + A a = b.m(b); + } + +} diff --git a/TracerOnJavassist/src/tracer/Tracer.java b/TracerOnJavassist/src/tracer/Tracer.java index 04b2185..97425d0 100644 --- a/TracerOnJavassist/src/tracer/Tracer.java +++ b/TracerOnJavassist/src/tracer/Tracer.java @@ -25,6 +25,7 @@ import javassist.expr.ExprEditor; import javassist.expr.FieldAccess; import javassist.expr.MethodCall; +import javassist.expr.NewExpr; public class Tracer { public static int lineNo = 1; @@ -34,7 +35,7 @@ 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"; public static void main(String[] args) { - String packageName = "worstCase"; // �w�肵���p�b�P�[�W�����̑S�N���X�ɃC���X�g�D�������e�[�V�������s�� + String packageName = "test"; // �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); File dir; @@ -62,7 +63,7 @@ CtClass cc; try { cc = cp.get(className); - for (final CtConstructor c : cc.getConstructors()) { + for (final CtConstructor c : cc.getDeclaredConstructors()) { methodInstrumentation(cc, c); } for (final CtMethod m : cc.getDeclaredMethods()) { @@ -125,8 +126,8 @@ } public void edit(MethodCall c) throws CannotCompileException { try { - if (c.getMethod().getDeclaringClass().getName().matches(STANDARD_CLASSES)) { - CtMethod m = c.getMethod(); + CtMethod m = c.getMethod(); + if (m.getDeclaringClass().getName().matches(STANDARD_CLASSES)) { Outputs out = generateOutputs(m.getDeclaringClass(), m, true); c.replace("{" + out.newOutput + out.methodOutput + out.classOutput + out.argsOutput + " $_ = $proceed($$); " + out.returnOutput + "}"); } @@ -134,10 +135,22 @@ e.printStackTrace(); } } + public void edit(NewExpr n) throws CannotCompileException { + try { + CtConstructor m = n.getConstructor(); + if (m.isEmpty() || m.getDeclaringClass().getName().matches(CONCRETE_STANDARD_CLASSES)) { + Outputs out = generateOutputs(m.getDeclaringClass(), m, true); + n.replace("{" + out.newOutput + out.methodOutput + out.classOutput + out.argsOutput + " $_ = $proceed($$); " + out.returnOutput + "}"); + } + } catch (NotFoundException e) { + e.printStackTrace(); + } + } public void edit(ConstructorCall c) throws CannotCompileException { try { - if (c.getConstructor().getDeclaringClass().getName().matches(CONCRETE_STANDARD_CLASSES)) { - CtConstructor m = c.getConstructor(); + CtConstructor m = c.getConstructor(); + if ((m.isEmpty() && !m.getDeclaringClass().getName().equals("java.lang.Object")) + || m.getDeclaringClass().getName().matches(CONCRETE_STANDARD_CLASSES)) { Outputs out = generateOutputs(m.getDeclaringClass(), m, true); c.replace("{" + out.newOutput + out.methodOutput + out.classOutput + out.argsOutput + " $_ = $proceed($$); " + out.returnOutput + "}"); } @@ -148,11 +161,13 @@ }); // ���\�b�h�p�̏o�͕��𐶐����� - Outputs outputs = generateOutputs(cc, m, false); - - // ���\�b�h�̎��s�O��ɏo�͕���}������ - m.insertBefore("{" + outputs.newOutput + outputs.methodOutput + outputs.classOutput + outputs.argsOutput + "}"); - m.insertAfter("{" + outputs.returnOutput + "}"); + if (!m.isEmpty()) { + Outputs outputs = generateOutputs(cc, m, false); + + // ���\�b�h�̎��s�O��ɏo�͕���}������ + m.insertBefore("{" + outputs.newOutput + outputs.methodOutput + outputs.classOutput + outputs.argsOutput + "}"); + m.insertAfter("{" + outputs.returnOutput + "}"); + } // CodeConverter conv = new CodeConverter(); // conv.replaceArrayAccess(cc, new @@ -268,6 +283,14 @@ // }); } + /** + * �g���[�X�o�͗p�̖��ߗ�𐶐����� + * @param cls �ΏۃN���X + * @param m �Ώۃ��\�b�h(�R���X�g���N�^) + * @param isCallerSideInstrumentation ���ߗ���Ăяo�����ɑ}�����邩�Ăяo����鑤�ɑ}�����邩? + * @return + * @throws NotFoundException + */ private static Outputs generateOutputs(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { Outputs outputs = new Outputs(); String declaredClassName = cls.getName(); @@ -353,12 +376,18 @@ shortName = m.getName().replace('$', '.') + "()"; // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� if (!isCallerSideInstrumentation) { // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) - outputs.returnOutput = "tracer.MyPrintStream.print(\"Return initialization(" + shortName + "):" + declaredClassName + ":\" + System.identityHashCode($0) + \":\");" + + outputs.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�̌ďo��) - outputs.returnOutput = "tracer.MyPrintStream.print(\"Return call(" + shortName + "):" + declaredClassName + ":\" + System.identityHashCode($_) + \":\");" + - "tracer.MyPrintStream.println(\"\" + System.identityHashCode($_) + " + LINE_AND_THREAD + ");"; + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�������̓f�t�H���g�R���X�g���N�^�̌ďo��) + outputs.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�̏ꍇ