diff --git a/TracerOnJavassist/.classpath b/TracerOnJavassist/.classpath new file mode 100644 index 0000000..59402b5 --- /dev/null +++ b/TracerOnJavassist/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TracerOnJavassist/.gitignore b/TracerOnJavassist/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/TracerOnJavassist/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/TracerOnJavassist/.project b/TracerOnJavassist/.project new file mode 100644 index 0000000..707961e --- /dev/null +++ b/TracerOnJavassist/.project @@ -0,0 +1,17 @@ + + + TracerOnJavassist + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/TracerOnJavassist/.settings/org.eclipse.jdt.core.prefs b/TracerOnJavassist/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..838bd9d --- /dev/null +++ b/TracerOnJavassist/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/TracerOnJavassist/javassist.jar b/TracerOnJavassist/javassist.jar new file mode 100644 index 0000000..e9840d5 --- /dev/null +++ b/TracerOnJavassist/javassist.jar Binary files differ diff --git a/TracerOnJavassist/src/finalLocal/Main.java b/TracerOnJavassist/src/finalLocal/Main.java new file mode 100644 index 0000000..5afdc64 --- /dev/null +++ b/TracerOnJavassist/src/finalLocal/Main.java @@ -0,0 +1,32 @@ +package finalLocal; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + Main m = new Main(); + m.coordinator(); + } + + static class A { + int get() { + return 2; + } + } + + public void coordinator() { + final A a = new A(); + class Test { + private A a2; + + public void test() { + a2 = a; + System.out.println(a2.get()); + } + } + Test t = new Test(); + t.test(); + } +} diff --git a/TracerOnJavassist/src/sample/A.java b/TracerOnJavassist/src/sample/A.java new file mode 100644 index 0000000..50a856f --- /dev/null +++ b/TracerOnJavassist/src/sample/A.java @@ -0,0 +1,10 @@ +package sample; + +public class A { + F f = new F(); + D d = new D(); + + public void m() { + d.passB(f, 10); + } +} diff --git a/TracerOnJavassist/src/sample/B.java b/TracerOnJavassist/src/sample/B.java new file mode 100644 index 0000000..3c33693 --- /dev/null +++ b/TracerOnJavassist/src/sample/B.java @@ -0,0 +1,9 @@ +package sample; + +public class B { + C c = new C(); + + public C getC() { + return c; + } +} diff --git a/TracerOnJavassist/src/sample/C.java b/TracerOnJavassist/src/sample/C.java new file mode 100644 index 0000000..731faaf --- /dev/null +++ b/TracerOnJavassist/src/sample/C.java @@ -0,0 +1,5 @@ +package sample; + +public class C { + +} diff --git a/TracerOnJavassist/src/sample/D.java b/TracerOnJavassist/src/sample/D.java new file mode 100644 index 0000000..fe4e592 --- /dev/null +++ b/TracerOnJavassist/src/sample/D.java @@ -0,0 +1,10 @@ +package sample; + +public class D { + E e = new E(); + B b = new B(); + public void passB(B b, int i) { + C c = b.getC(); + e.setC(c); + } +} diff --git a/TracerOnJavassist/src/sample/E.java b/TracerOnJavassist/src/sample/E.java new file mode 100644 index 0000000..1d110ed --- /dev/null +++ b/TracerOnJavassist/src/sample/E.java @@ -0,0 +1,15 @@ +package sample; + +public class E { + C c = new C(); + C c2 = new C(); + + + public void setC(C c) { + System.out.println("this.c = "+this.c.toString() +"/ Argu c = "+ c.toString()); + System.out.println("this.c = "+this.c.hashCode() +"/ Argu c = "+ c.hashCode()); + this.c = c; + + } + +} diff --git a/TracerOnJavassist/src/sample/F.java b/TracerOnJavassist/src/sample/F.java new file mode 100644 index 0000000..6de79b4 --- /dev/null +++ b/TracerOnJavassist/src/sample/F.java @@ -0,0 +1,9 @@ +package sample; + +public class F extends B { + C c = new C(); + + public C getC() { + return super.getC(); + } +} diff --git a/TracerOnJavassist/src/sample/Main.java b/TracerOnJavassist/src/sample/Main.java new file mode 100644 index 0000000..b835818 --- /dev/null +++ b/TracerOnJavassist/src/sample/Main.java @@ -0,0 +1,16 @@ +package sample; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + A a = new A(); + A b = new A(); + a.m(); + b.m(); + } + +} diff --git a/TracerOnJavassist/src/threadSample/A.java b/TracerOnJavassist/src/threadSample/A.java new file mode 100644 index 0000000..c66b121 --- /dev/null +++ b/TracerOnJavassist/src/threadSample/A.java @@ -0,0 +1,10 @@ +package threadSample; + +public class A { + B b = new B(); + D d = new D(); + + public void m() { + d.setC(b.getC()); + } +} diff --git a/TracerOnJavassist/src/threadSample/B.java b/TracerOnJavassist/src/threadSample/B.java new file mode 100644 index 0000000..a0b32fa --- /dev/null +++ b/TracerOnJavassist/src/threadSample/B.java @@ -0,0 +1,10 @@ +package threadSample; + +public class B { + C c = new C(); + + public C getC() { + return c; + } + +} diff --git a/TracerOnJavassist/src/threadSample/C.java b/TracerOnJavassist/src/threadSample/C.java new file mode 100644 index 0000000..b533120 --- /dev/null +++ b/TracerOnJavassist/src/threadSample/C.java @@ -0,0 +1,5 @@ +package threadSample; + +public class C { + +} diff --git a/TracerOnJavassist/src/threadSample/D.java b/TracerOnJavassist/src/threadSample/D.java new file mode 100644 index 0000000..b847233 --- /dev/null +++ b/TracerOnJavassist/src/threadSample/D.java @@ -0,0 +1,10 @@ +package threadSample; + +public class D { + C c; + + public void setC(C c) { + this.c = c; + } + +} diff --git a/TracerOnJavassist/src/threadSample/Main.java b/TracerOnJavassist/src/threadSample/Main.java new file mode 100644 index 0000000..152bb73 --- /dev/null +++ b/TracerOnJavassist/src/threadSample/Main.java @@ -0,0 +1,15 @@ +package threadSample; + +import threadSample.ThreadSample; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + Thread thread = new ThreadSample(); + thread.start(); + } + +} diff --git a/TracerOnJavassist/src/threadSample/ThreadSample.java b/TracerOnJavassist/src/threadSample/ThreadSample.java new file mode 100644 index 0000000..a6d5d23 --- /dev/null +++ b/TracerOnJavassist/src/threadSample/ThreadSample.java @@ -0,0 +1,14 @@ +package threadSample; + +public class ThreadSample extends Thread { + public void run() { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + A a = new A(); + a.m(); + } + }); + thread.start(); + } +} diff --git a/TracerOnJavassist/src/tracer/MyPrintStream.java b/TracerOnJavassist/src/tracer/MyPrintStream.java new file mode 100644 index 0000000..c703ffb --- /dev/null +++ b/TracerOnJavassist/src/tracer/MyPrintStream.java @@ -0,0 +1,92 @@ +package tracer; + +import java.util.ArrayList; + +public class MyPrintStream extends Thread { + private static MyPrintStream theInstance; + private static ArrayList output; + private static String s; +// private static boolean bFlushed = false; +// private static int count = 0; + + private static MyPrintStream getInstance() { + if (theInstance == null) { + theInstance = new MyPrintStream(); + output = new ArrayList(); + Runtime.getRuntime().addShutdownHook(theInstance); // �V���b�g�_�E���p +// theInstance.start(); + } + return theInstance; + } + + public static void print(int n) { + getInstance()._print(n); + } + + public static void print(String s) { + getInstance()._print(s); + } + + public static void println() { + getInstance()._println(); + } + + public static void println(String s) { + getInstance()._println(s); + } + + public void run() { +// if (count == 0) { +// // �ʏ�̃g���[�X�o�� +// count++; +// String s; +// Runtime.getRuntime().addShutdownHook(new MyPrintStream()); // �V���b�g�_�E���p�ɂ����ЂƂƒC���X�^���X���쐬���� +// while(!bFlushed) { +// try { +// Thread.sleep(10); +// if (output.size() > 0) { +// synchronized (output) { +// s = output.remove(0); +// } +// System.out.println(s); +// } +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// } else { + // �V���b�g�_�E�����Ƀo�b�t�@�Ɏc�����g���[�X���o�͂��؂� +// bFlushed = true; + for (int n = 0; n < output.size(); n++) { + System.out.println(output.get(n)); + } +// } + } + + private void _print(int n) { + if (s == null) s = new String(); + s += n; + } + + private void _print(String s1) { + if (s == null) s = new String(); + s += s1; + } + + private void _println() { + if (s == null) s = new String(); + synchronized (output) { + output.add(s); + } + s = new String(); + } + + private void _println(String s1) { + if (s == null) s = new String(); + s += s1; + synchronized (output) { + output.add(s); + } + s = new String(); + } +} diff --git a/TracerOnJavassist/src/tracer/Tracer.java b/TracerOnJavassist/src/tracer/Tracer.java new file mode 100644 index 0000000..04b2185 --- /dev/null +++ b/TracerOnJavassist/src/tracer/Tracer.java @@ -0,0 +1,404 @@ +package tracer; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLDecoder; +import java.util.Enumeration; + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CodeConverter; +import javassist.CodeConverter.ArrayAccessReplacementMethodNames; +import javassist.CtBehavior; +import javassist.CtClass; +import javassist.CtConstructor; +import javassist.CtField; +import javassist.CtMethod; +import javassist.Modifier; +import javassist.NotFoundException; +import javassist.bytecode.BadBytecode; +import javassist.bytecode.analysis.ControlFlow; +import javassist.bytecode.analysis.ControlFlow.Block; +import javassist.expr.ConstructorCall; +import javassist.expr.ExprEditor; +import javassist.expr.FieldAccess; +import javassist.expr.MethodCall; + +public class Tracer { + public static int lineNo = 1; + private static final String LINE_AND_THREAD = "\":Line \" + (tracer.Tracer.lineNo++) + \":ThreadNo \" + Thread.currentThread().getId()"; + private static final String LINE = "\":Line \" + (tracer.Tracer.lineNo++) + \":\""; + 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"; + + public static void main(String[] args) { + String packageName = "worstCase"; // �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; + try { + dir = new File(URLDecoder.decode(resource.getPath(), "UTF-8")); + for (String file : dir.list()) { + if (file.endsWith(".class")) { + String className = packageName + "." + file.replace(".class", ""); + classInstrumentation(className); + } + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + /** + * �w�肵���N���X�ɃC���X�g�D�������e�[�V�������s���i���j + * + * @param className + * �N���X�� + */ + private static void classInstrumentation(String className) { + ClassPool cp = ClassPool.getDefault(); + CtClass cc; + try { + cc = cp.get(className); + for (final CtConstructor c : cc.getConstructors()) { + methodInstrumentation(cc, c); + } + for (final CtMethod m : cc.getDeclaredMethods()) { + methodInstrumentation(cc, m); + } + cc.writeFile("bin"); + } catch (NotFoundException | BadBytecode | CannotCompileException | IOException e) { + e.printStackTrace(); + // } catch (CannotCompileException | IOException e) { + // e.printStackTrace(); + } + } + + private static void methodInstrumentation(CtClass cc, final CtBehavior m) + throws BadBytecode, NotFoundException, CannotCompileException { +// ControlFlow cf = new ControlFlow(m); + final String declaredClassName = cc.getName(); + String methodSignature = m.getSignature(); + + // ���\�b�h�{�̓��̃t�B�[���h�A�N�Z�X�ƃ��\�b�h�Ăяo����u�������� + m.instrument(new ExprEditor() { + public void edit(FieldAccess f) throws CannotCompileException { + if (f.isReader()) { + if (!f.getFieldName().contains("$")) { // AspectJ�ł� final local �ϐ�����̃Q�b�g�͖��������̂ŁA����ɍ��킹�ď��O���� + String thisOutput = ""; + if ((m.getModifiers() & Modifier.STATIC) == 0 && m instanceof CtMethod) { + thisOutput = "tracer.MyPrintStream.print(\"get:\" + this.getClass().getName() + \":\" + System.identityHashCode(this) + \":\"); "; + } else { + // static���\�b�h���R���X�g���N�^�̏ꍇ + thisOutput = "tracer.MyPrintStream.print(\"get:" + declaredClassName + ":0:\"); "; + } + f.replace("{$_ = $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 + ");" + + "} " + "}"); + } + } else { + if (!f.getFieldName().contains("$")) { // ���̏������Ȃ��ƂȂ���������i�����t�B�[���h?�ւ̃Z�b�g�������āA������E���ė����Ă�?�j + f.replace("{$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) + " + LINE_AND_THREAD + ");" + + "} else {" + + "tracer.MyPrintStream.println(\"---:0\" + " + LINE_AND_THREAD + ");" + + "}" + "}"); + } + } + } + public void edit(MethodCall c) throws CannotCompileException { + try { + if (c.getMethod().getDeclaringClass().getName().matches(STANDARD_CLASSES)) { + CtMethod m = c.getMethod(); + Outputs out = generateOutputs(m.getDeclaringClass(), m, true); + c.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(); + Outputs out = generateOutputs(m.getDeclaringClass(), m, true); + c.replace("{" + out.newOutput + out.methodOutput + out.classOutput + out.argsOutput + " $_ = $proceed($$); " + out.returnOutput + "}"); + } + } catch (NotFoundException e) { + e.printStackTrace(); + } + } + }); + + // ���\�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 + "}"); + + // CodeConverter conv = new CodeConverter(); + // conv.replaceArrayAccess(cc, new + // ArrayAccessReplacementMethodNames() { + // @Override + // public String shortWrite() { + // return null; + // } + // @Override + // public String shortRead() { + // return null; + // } + // @Override + // public String objectWrite() { + // return null; + // } + // @Override + // public String objectRead() { + // return null; + // } + // @Override + // public String longWrite() { + // return null; + // } + // @Override + // public String longRead() { + // return null; + // } + // @Override + // public String intWrite() { + // return null; + // } + // @Override + // public String intRead() { + // return null; + // } + // @Override + // public String floatWrite() { + // return null; + // } + // @Override + // public String floatRead() { + // return null; + // } + // @Override + // public String doubleWrite() { + // return null; + // } + // @Override + // public String doubleRead() { + // return null; + // } + // @Override + // public String charWrite() { + // return null; + // } + // @Override + // public String charRead() { + // return null; + // } + // @Override + // public String byteOrBooleanWrite() { + // return null; + // } + // @Override + // public String byteOrBooleanRead() { + // return null; + // } + // }); + // Block[] blocks = cf.basicBlocks(); + // int block0 = m.getMethodInfo().getLineNumber(blocks[0].position()); + // int block1 = + // m.getMethodInfo().getLineNumber(blocks[1].position()); + // int block2 = + // m.getMethodInfo().getLineNumber(blocks[2].position()); + // int block3 = + // m.getMethodInfo().getLineNumber(blocks[3].position()); + // int block4 = + // m.getMethodInfo().getLineNumber(blocks[4].position()); + //�@m.insertAt(block0, "tracer.MyPrintStream.println(\"block0:\" + " + block0 + ");"); + // m.insertAt(block1, "tracer.MyPrintStream.println(\"block1:\" + " + + // block1 + ");"); + // m.insertAt(block2, "tracer.MyPrintStream.println(\"block2:\" + " + + // block2 + ");"); + // m.insertAt(block3, "tracer.MyPrintStream.println(\"block3:\" + " + + // block3 + ");"); + // m.insertAt(block4, "tracer.MyPrintStream.println(\"block4:\" + " + + // block4 + ");"); + + // int block0 = + // m.getMethodInfo().getLineNumber(blocks[0].position()); + // m.insertAt(block0, "tracer.MyPrintStream.println(\"block0\");"); + // m = cc.getDeclaredMethod("getC"); + // cf = new ControlFlow(m); + // blocks = cf.basicBlocks(); + // int block1 = + // m.getMethodInfo().getLineNumber(blocks[1].position()); + // m.insertAt(block1, "tracer.MyPrintStream.println(\"block1\");"); + // m = cc.getDeclaredMethod("getC"); + // cf = new ControlFlow(m); + // blocks = cf.basicBlocks(); + // int block2 = + // m.getMethodInfo().getLineNumber(blocks[2].position()); + // m.insertAt(block2, "tracer.MyPrintStream.println(\"block2\");"); + + // m.instrument(new ExprEditor() { + // public void edit(MethodCall m) throws CannotCompileException + // { + // if (m.getClassName().equals("Hello") + // && m.getMethodName().equals("say")) + // m.replace("$0.hi();"); + // } + // }); + } + + private static Outputs generateOutputs(CtClass cls, CtBehavior m, boolean isCallerSideInstrumentation) throws NotFoundException { + Outputs outputs = new Outputs(); + String declaredClassName = cls.getName(); + String delimiter = "tracer.MyPrintStream.println(\"Args:\" + "; + CtClass parameterClasses[] = m.getParameterTypes(); + int p = 0; + for (CtClass c : parameterClasses) { + if (!c.isPrimitive()) { + outputs.argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + System.identityHashCode($" + (p + 1) + ")"; + } else { + outputs.argsOutput += delimiter + "$args[" + p + "].getClass().getName() + " + "\":\" + $" + (p + 1); + } + p++; + delimiter = " + \":\" + "; + } + if (p > 0) { + outputs.argsOutput += " + " + LINE_AND_THREAD + ");"; + } + + String accessor = ""; + if ((m.getModifiers() & Modifier.PUBLIC) != 0) { + accessor = "public "; + } else if ((m.getModifiers() & Modifier.PRIVATE) != 0) { + accessor = "private "; + } else if ((m.getModifiers() & Modifier.PROTECTED) != 0) { + accessor = "protected "; + } + String longName = null; + if ((m.getModifiers() & Modifier.STATIC) != 0) { + // static���\�b�h�̏ꍇ + longName = accessor + "static " + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + outputs.methodOutput = "tracer.MyPrintStream.println(\"Method " + declaredClassName + "," + longName + + ":\" + 0 + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; + outputs.classOutput = "tracer.MyPrintStream.println(\"Class " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; + } else if (m instanceof CtConstructor) { + // �R���X�g���N�^�̏ꍇ + longName = accessor + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + outputs.newOutput = "tracer.MyPrintStream.println(\"New " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; + outputs.methodOutput = "tracer.MyPrintStream.println(\"Method " + declaredClassName + "," + longName + + ":\" + 0 + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; + outputs.classOutput = "tracer.MyPrintStream.println(\"Class " + declaredClassName + ":\" + 0 + " + LINE_AND_THREAD + ");"; + } else { + // �ʏ�̃��\�b�h�̏ꍇ + longName = accessor + ((CtMethod)m).getReturnType().getName() + " " + m.getLongName().replace('$', '.'); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + if (!isCallerSideInstrumentation) { + // �Ăяo����ɖ��ߍ��ޏꍇ(�ʏ�) + outputs.methodOutput = "tracer.MyPrintStream.println(\"Method \" + this.getClass().getName() + \"," + longName + + ":\" + System.identityHashCode(this) + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; + outputs.classOutput = "tracer.MyPrintStream.println(\"Class \" + this.getClass().getName() + \":\" + System.identityHashCode(this) + " + LINE_AND_THREAD + ");"; + } else { + // �ďo�����ɖ��ߍ��ޏꍇ(�W���N���X�̌ďo��) + outputs.methodOutput = "tracer.MyPrintStream.println(\"Method \" + $0.getClass().getName() + \"," + longName + + ":\" + System.identityHashCode($0) + " + LINE + " + System.nanoTime() + \":ThreadNo \" + Thread.currentThread().getId());"; + outputs.classOutput = "tracer.MyPrintStream.println(\"Class \" + $0.getClass().getName() + \":\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; + } + } + + 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) { + outputs.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 { + outputs.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����ɖ��ߍ��ޏꍇ(�ʏ�) + outputs.returnOutput = "tracer.MyPrintStream.print(\"Return initialization(" + shortName + "):" + declaredClassName + ":\" + 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 + ");"; + } + } 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) { + outputs.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 { + outputs.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) { + outputs.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 { + outputs.returnOutput = "tracer.MyPrintStream.print(\"Return execution(" + shortName + "):" + ((CtMethod)m).getReturnType().getName() + ":\" + $_ + \":\");" + + "tracer.MyPrintStream.println(\"\" + System.identityHashCode($0) + " + LINE_AND_THREAD + ");"; + } + } + } + return outputs; + } + + private static class Outputs { + String newOutput = ""; + String methodOutput = ""; + String classOutput = ""; + String argsOutput = ""; + String returnOutput = ""; + } +} diff --git a/TracerOnJavassist/src/worstCase/A.java b/TracerOnJavassist/src/worstCase/A.java new file mode 100644 index 0000000..dc4bf09 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/A.java @@ -0,0 +1,9 @@ +package worstCase; + +class A { + B b = new B(); + N n = new N(); + void m() { + n.passI(b.getI()); + } +} diff --git a/TracerOnJavassist/src/worstCase/B.java b/TracerOnJavassist/src/worstCase/B.java new file mode 100644 index 0000000..7317f2e --- /dev/null +++ b/TracerOnJavassist/src/worstCase/B.java @@ -0,0 +1,8 @@ +package worstCase; + +class B { + C c = new C(); + I getI() { + return c.getF().getI(); + } +} diff --git a/TracerOnJavassist/src/worstCase/C.java b/TracerOnJavassist/src/worstCase/C.java new file mode 100644 index 0000000..c06fcdf --- /dev/null +++ b/TracerOnJavassist/src/worstCase/C.java @@ -0,0 +1,8 @@ +package worstCase; + +class C { + D d = new D(); + F getF() { + return d.getE().getF(); + } +} diff --git a/TracerOnJavassist/src/worstCase/D.java b/TracerOnJavassist/src/worstCase/D.java new file mode 100644 index 0000000..9506e86 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/D.java @@ -0,0 +1,8 @@ +package worstCase; + +class D { + E e = new E(); + E getE() { + return e; + } +} diff --git a/TracerOnJavassist/src/worstCase/E.java b/TracerOnJavassist/src/worstCase/E.java new file mode 100644 index 0000000..dd6eac4 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/E.java @@ -0,0 +1,8 @@ +package worstCase; + +class E { + F f = new F(); + F getF() { + return f; + } +} diff --git a/TracerOnJavassist/src/worstCase/F.java b/TracerOnJavassist/src/worstCase/F.java new file mode 100644 index 0000000..a96a7d1 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/F.java @@ -0,0 +1,8 @@ +package worstCase; + +class F { + G g = new G(); + I getI() { + return g.getH().getI(); + } +} diff --git a/TracerOnJavassist/src/worstCase/G.java b/TracerOnJavassist/src/worstCase/G.java new file mode 100644 index 0000000..f34b5d9 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/G.java @@ -0,0 +1,8 @@ +package worstCase; + +class G { + H h = new H(); + H getH() { + return h; + } +} diff --git a/TracerOnJavassist/src/worstCase/H.java b/TracerOnJavassist/src/worstCase/H.java new file mode 100644 index 0000000..f7b51b5 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/H.java @@ -0,0 +1,8 @@ +package worstCase; + +class H { + I i = new I(); + I getI() { + return i; + } +} diff --git a/TracerOnJavassist/src/worstCase/I.java b/TracerOnJavassist/src/worstCase/I.java new file mode 100644 index 0000000..17d977c --- /dev/null +++ b/TracerOnJavassist/src/worstCase/I.java @@ -0,0 +1,8 @@ +package worstCase; + +class I { + J j = new J(); + L getL() { + return j.getK().getL(); + } +} diff --git a/TracerOnJavassist/src/worstCase/J.java b/TracerOnJavassist/src/worstCase/J.java new file mode 100644 index 0000000..ec253eb --- /dev/null +++ b/TracerOnJavassist/src/worstCase/J.java @@ -0,0 +1,8 @@ +package worstCase; + +class J { + K k = new K(); + K getK() { + return k; + } +} diff --git a/TracerOnJavassist/src/worstCase/K.java b/TracerOnJavassist/src/worstCase/K.java new file mode 100644 index 0000000..7ff3060 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/K.java @@ -0,0 +1,8 @@ +package worstCase; + +class K { + L l = new L(); + L getL() { + return l; + } +} diff --git a/TracerOnJavassist/src/worstCase/L.java b/TracerOnJavassist/src/worstCase/L.java new file mode 100644 index 0000000..f43105e --- /dev/null +++ b/TracerOnJavassist/src/worstCase/L.java @@ -0,0 +1,8 @@ +package worstCase; + +class L { + M m = new M(); + M getM() { + return m; + } +} diff --git a/TracerOnJavassist/src/worstCase/M.java b/TracerOnJavassist/src/worstCase/M.java new file mode 100644 index 0000000..94732c5 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/M.java @@ -0,0 +1,5 @@ +package worstCase; + +public class M { + +} diff --git a/TracerOnJavassist/src/worstCase/N.java b/TracerOnJavassist/src/worstCase/N.java new file mode 100644 index 0000000..b9f9ea5 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/N.java @@ -0,0 +1,8 @@ +package worstCase; + +class N { + O o = new O(); + void passI(I i) { + o.passL(i.getL()); + } +} diff --git a/TracerOnJavassist/src/worstCase/O.java b/TracerOnJavassist/src/worstCase/O.java new file mode 100644 index 0000000..b353700 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/O.java @@ -0,0 +1,8 @@ +package worstCase; + +class O { + P p = new P(); + void passL(L l) { + p.setM(l.getM()); + } +} diff --git a/TracerOnJavassist/src/worstCase/P.java b/TracerOnJavassist/src/worstCase/P.java new file mode 100644 index 0000000..7397ecc --- /dev/null +++ b/TracerOnJavassist/src/worstCase/P.java @@ -0,0 +1,8 @@ +package worstCase; + +class P { + M m; + void setM(M m) { + this.m = m; + } +} diff --git a/TracerOnJavassist/src/worstCase/main.java b/TracerOnJavassist/src/worstCase/main.java new file mode 100644 index 0000000..5106a39 --- /dev/null +++ b/TracerOnJavassist/src/worstCase/main.java @@ -0,0 +1,14 @@ +package worstCase; + +public class main { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + A a = new A(); + a.m(); + } + +}