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();
+ }
+
+}