Skip to content

Commit 6d82de4

Browse files
committed
disable some of the callback resolution as it requires class resolution.
1 parent cbc70e3 commit 6d82de4

5 files changed

Lines changed: 166 additions & 96 deletions

File tree

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/Instrumenter.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import edu.columbia.cs.psl.chroniclerj.visitor.NonDeterministicLoggingClassVisitor;
3737

3838
public class Instrumenter {
39-
public static URLClassLoader loader;
39+
public static ClassLoader loader;
4040

4141
private static Logger logger = Logger.getLogger(Instrumenter.class);
4242

@@ -627,19 +627,20 @@ public static boolean classIsCallback(String className, String superName, String
627627
if (superName != null)
628628
if (superName.equals(className) || superName.equals("java/lang/Object") || className.equals("org/eclipse/jdt/core/compiler/BuildContext"))
629629
return false;
630-
try {
631-
Class<?> c = Instrumenter.loader.loadClass(className.replace("/", "."));
632-
for (Class<?> i : c.getInterfaces()) {
633-
if (NonDeterministicLoggingClassVisitor.callbackClasses.contains(Type.getInternalName(i)))
634-
return true;
635-
}
636-
Class<?> superClass = c.getSuperclass();
637-
if (superClass == null)
638-
return false;
639-
return classIsCallback(Type.getInternalName(superClass), null, null);
640-
} catch (ClassNotFoundException ex) {
630+
// try {
631+
// Class<?> c = Instrumenter.loader.loadClass(className.replace("/", "."));
632+
// for (Class<?> i : c.getInterfaces()) {
633+
// if (NonDeterministicLoggingClassVisitor.callbackClasses.contains(Type.getInternalName(i)))
634+
// return true;
635+
// }
636+
// Class<?> superClass = c.getSuperclass();
637+
// if (superClass == null)
638+
// return false;
639+
// return classIsCallback(Type.getInternalName(superClass), null, null);
641640
return false;
642-
}
641+
// } catch (ClassNotFoundException ex) {
642+
// return false;
643+
// }
643644
}
644645

645646
public static boolean methodIsCallback(String className, String name, String desc, String superName, String[] interfaces) {
@@ -656,19 +657,19 @@ public static boolean methodIsCallback(String className, String name, String des
656657
if (superName != null)
657658
if (superName.equals(className) || superName.equals("java/lang/Object") || className.equals("org/eclipse/jdt/core/compiler/BuildContext"))
658659
return false;
659-
try {
660-
Class<?> c = Instrumenter.loader.loadClass(className.replace("/", "."));
661-
for (Class<?> i : c.getInterfaces()) {
662-
if (NonDeterministicLoggingClassVisitor.callbackMethods.contains(Type.getInternalName(i)+key))
663-
return true;
664-
}
665-
Class<?> superClass = c.getSuperclass();
666-
if (superClass == null)
660+
// try {
661+
// Class<?> c = Class.forName(className.replace("/", "."), false, Instrumenter.loader);
662+
// for (Class<?> i : c.getInterfaces()) {
663+
// if (NonDeterministicLoggingClassVisitor.callbackMethods.contains(Type.getInternalName(i)+key))
664+
// return true;
665+
// }
666+
// Class<?> superClass = c.getSuperclass();
667+
// if (superClass == null)
667668
return false;
668-
return methodIsCallback(Type.getInternalName(superClass), name, desc, null, null);
669-
} catch (ClassNotFoundException ex) {
670-
return false;
671-
}
669+
// return methodIsCallback(Type.getInternalName(superClass), name, desc, null, null);
670+
// } catch (ClassNotFoundException ex) {
671+
// return false;
672+
// }
672673
}
673674

674675

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/Log.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ public static void log(Object toLog, String debug) {
4242
System.arraycopy(Log.aLog, 0, newLog, 0, Log.aLog.length);
4343
Log.aLog = newLog;
4444
String[] newOwners = new String[(int) (Log.aLog.length * Constants.LOG_GROWTH_RATE)];
45-
System.arraycopy(Log.aLog_owners, 0, newOwners, 0, Log.aLog.length);
45+
System.arraycopy(Log.aLog_owners, 0, newOwners, 0, Log.aLog_owners.length);
4646
Log.aLog_owners = newOwners;
4747
String[] newDebug = new String[(int) (Log.aLog.length * Constants.LOG_GROWTH_RATE)];
48-
System.arraycopy(Log.aLog_debug, 0, newDebug, 0, Log.aLog.length);
48+
System.arraycopy(Log.aLog_debug, 0, newDebug, 0, Log.aLog_debug.length);
4949
Log.aLog_debug = newDebug;
5050
}
5151
Log.aLog[Log.aLog_fill] = toLog;
Lines changed: 110 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package edu.columbia.cs.psl.chroniclerj;
22

3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileOutputStream;
6+
import java.io.FileWriter;
7+
import java.io.PrintWriter;
38
import java.lang.instrument.ClassFileTransformer;
49
import java.lang.instrument.IllegalClassFormatException;
510
import java.lang.instrument.Instrumentation;
@@ -9,69 +14,131 @@
914
import org.objectweb.asm.ClassWriter;
1015
import org.objectweb.asm.Opcodes;
1116
import org.objectweb.asm.commons.SerialVersionUIDAdder;
17+
import org.objectweb.asm.util.CheckClassAdapter;
18+
import org.objectweb.asm.util.TraceClassVisitor;
1219

1320
import edu.columbia.cs.psl.chroniclerj.replay.NonDeterministicReplayClassVisitor;
1421
import edu.columbia.cs.psl.chroniclerj.visitor.CallbackDuplicatingClassVisitor;
1522
import edu.columbia.cs.psl.chroniclerj.visitor.NonDeterministicLoggingClassVisitor;
1623

1724
public class PreMain {
18-
public static boolean isIgnoredClass(String className) {
19-
return className.startsWith("java") || className.startsWith("com/sun") || className.startsWith("sun/") || className.startsWith("edu/columbia/cs/psl/chroniclerj") || className.startsWith("com/rits/cloning") || className.startsWith("jdk")
20-
||className.startsWith("com/thoughtworks") || className.startsWith("org/xmlpull")
21-
|| className.startsWith("org/kxml2");
22-
}
25+
static boolean replay;
2326

24-
public static void premain(String _args, Instrumentation inst) {
25-
final boolean replay = _args != null && _args.equals("replay");
26-
if(_args != null)
27-
{
28-
String[] args = _args.split(",");
29-
for(String arg : args)
30-
{
31-
String[] d = arg.split("=");
32-
if(d[0].equals("logFile"))
33-
{
34-
ChroniclerJExportRunner.nameOverride = d[1];
35-
}
36-
else if(d[0].equals("alwaysExport"))
37-
{
38-
ChroniclerJExportRunner.registerShutdownHook();
39-
}
40-
}
41-
}
42-
ClassFileTransformer transformer = new ClassFileTransformer() {
43-
44-
@Override
45-
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
46-
if (replay) {
27+
static class ChroniclerTransformer implements ClassFileTransformer {
28+
@Override
29+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
30+
// Instrumenter.loader = loader;
31+
if (replay) {
32+
try {
4733
ClassReader cr = new ClassReader(classfileBuffer);
4834
if (isIgnoredClass(cr.getClassName()))
4935
return null;
5036
System.out.println("Inst: " + cr.getClassName());
5137
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
5238
NonDeterministicReplayClassVisitor cv = new NonDeterministicReplayClassVisitor(Opcodes.ASM5, cw);
5339
cr.accept(cv, ClassReader.EXPAND_FRAMES);
40+
if (DEBUG) {
41+
File f = new File("debug-replay/" + className + ".class");
42+
f.getParentFile().mkdirs();
43+
FileOutputStream fos = new FileOutputStream(f);
44+
fos.write(cw.toByteArray());
45+
fos.close();
46+
}
5447
return cw.toByteArray();
55-
} else {
56-
try {
57-
ClassReader cr = new ClassReader(classfileBuffer);
58-
if (isIgnoredClass(cr.getClassName()))
59-
return null;
60-
System.out.println("Inst: " + cr.getClassName());
61-
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
62-
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(cw));
63-
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
64-
65-
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
66-
return cw.toByteArray();
67-
} catch (Throwable t) {
68-
t.printStackTrace();
48+
} catch (Throwable t) {
49+
t.printStackTrace();
50+
return null;
51+
}
52+
} else {
53+
try {
54+
ClassReader cr = new ClassReader(classfileBuffer);
55+
if (isIgnoredClass(cr.getClassName()))
6956
return null;
57+
System.out.println("Inst: " + cr.getClassName());
58+
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
59+
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(cw));
60+
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
61+
62+
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
63+
if (DEBUG) {
64+
File f = new File("debug-record/" + className + ".class");
65+
f.getParentFile().mkdirs();
66+
FileOutputStream fos = new FileOutputStream(f);
67+
fos.write(cw.toByteArray());
68+
fos.close();
69+
}
70+
cr = new ClassReader(cw.toByteArray());
71+
CheckClassAdapter ca = new CheckClassAdapter(new ClassWriter(0));
72+
cr.accept(ca, 0);
73+
return cw.toByteArray();
74+
} catch (Throwable t) {
75+
t.printStackTrace();
76+
if (DEBUG) {
77+
TraceClassVisitor tcv = null;
78+
PrintWriter fw = null;
79+
try {
80+
File f = new File("z.class");
81+
f.getParentFile().mkdirs();
82+
f.delete();
83+
FileOutputStream fos = new FileOutputStream(f);
84+
fos.write(classfileBuffer);
85+
fos.close();
86+
fw = new PrintWriter("lastClass.txt");
87+
ClassReader cr = new ClassReader(classfileBuffer);
88+
89+
tcv = new TraceClassVisitor(fw);
90+
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(tcv));
91+
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
92+
93+
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
94+
95+
} catch (Throwable t2) {
96+
t2.printStackTrace();
97+
} finally {
98+
tcv.visitEnd();
99+
fw.close();
100+
}
70101
}
102+
return null;
71103
}
72104
}
73-
};
105+
}
106+
}
107+
108+
public static boolean isIgnoredClass(String className) {
109+
return className.startsWith("java") || className.startsWith("com/sun") || className.startsWith("sun/") || className.startsWith("edu/columbia/cs/psl/chroniclerj") || className.startsWith("com/rits/cloning") || className.startsWith("jdk")
110+
|| className.startsWith("com/thoughtworks") || className.startsWith("org/xmlpull") || className.startsWith("org/kxml2");
111+
}
112+
113+
static boolean DEBUG = false;
114+
115+
public static void premain(String _args, Instrumentation inst) {
116+
replay = _args != null && _args.equals("replay");
117+
if (_args != null) {
118+
String[] args = _args.split(",");
119+
for (String arg : args) {
120+
String[] d = arg.split("=");
121+
if (d[0].equals("logFile")) {
122+
ChroniclerJExportRunner.nameOverride = d[1];
123+
} else if (d[0].equals("alwaysExport")) {
124+
ChroniclerJExportRunner.registerShutdownHook();
125+
} else if (d[0].equals("debug"))
126+
DEBUG = true;
127+
}
128+
}
129+
ClassFileTransformer transformer = new ChroniclerTransformer();
74130
inst.addTransformer(transformer);
75131

76132
}
133+
134+
public static void main(String[] args) throws Throwable {
135+
DEBUG = true;
136+
FileInputStream fis = new FileInputStream("z.class");
137+
byte[] b = new byte[1024 * 1024 * 2];
138+
int l = fis.read(b);
139+
fis.close();
140+
byte[] a = new byte[l];
141+
System.arraycopy(b, 0, a, 0, l);
142+
new ChroniclerTransformer().transform(null, null, null, null, a);
143+
}
77144
}

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/visitor/NonDeterministicLoggingClassVisitor.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@
1515
import org.objectweb.asm.commons.AnalyzerAdapter;
1616
import org.objectweb.asm.commons.JSRInlinerAdapter;
1717
import org.objectweb.asm.commons.LocalVariablesSorter;
18-
import org.objectweb.asm.tree.ClassNode;
1918
import org.objectweb.asm.tree.FieldNode;
2019
import org.objectweb.asm.tree.MethodInsnNode;
21-
import org.objectweb.asm.util.CheckClassAdapter;
2220

2321
import edu.columbia.cs.psl.chroniclerj.Constants;
2422
import edu.columbia.cs.psl.chroniclerj.Instrumenter;
@@ -51,7 +49,7 @@ public class NonDeterministicLoggingClassVisitor extends ClassVisitor implements
5149
}
5250

5351
public NonDeterministicLoggingClassVisitor(ClassVisitor cv) {
54-
super(Opcodes.ASM5, new CheckClassAdapter(cv));
52+
super(Opcodes.ASM5, cv);
5553
}
5654

5755
private static Logger logger = Logger.getLogger(NonDeterministicLoggingClassVisitor.class);
@@ -84,10 +82,9 @@ public MethodVisitor visitMethod(int acc, String name, String desc, String signa
8482
}
8583

8684
if (Instrumenter.classIsCallback(className, superName, interfaces)) {
87-
AnalyzerAdapter analyzer = new AnalyzerAdapter(className, acc, name, desc, smv);
8885
// JSRInlinerAdapter mv = new JSRInlinerAdapter(analyzer, acc, name, desc, signature,
8986
// exceptions);
90-
CloningAdviceAdapter caa = new CloningAdviceAdapter(analyzer, acc, name, desc,
87+
CloningAdviceAdapter caa = new CloningAdviceAdapter(smv, acc, name, desc,
9188
className);
9289
smv = new CallbackLoggingMethodVisitor(caa, acc, name, desc, className,
9390
null, caa, superName, interfaces);
@@ -101,21 +98,18 @@ public MethodVisitor visitMethod(int acc, String name, String desc, String signa
10198
&& !name.equals(Constants.SET_FIELDS_METHOD_NAME)
10299
&& !className.startsWith("com/thoughtworks")) {
103100

104-
AnalyzerAdapter analyzer = new AnalyzerAdapter(className, acc, name, desc, smv);
105101
// JSRInlinerAdapter mv = new JSRInlinerAdapter(analyzer, acc, name, desc, signature,
106102
// exceptions);
107103
// LocalVariablesSorter sorter = new LocalVariablesSorter(acc, desc,
108104
// analyzer);
109-
105+
AnalyzerAdapter analyzer = new AnalyzerAdapter(className, acc, name, desc, smv);
110106
NonDeterministicLoggingMethodVisitor cloningMV = new NonDeterministicLoggingMethodVisitor(
111-
analyzer, acc, name, desc, className, superName, isFirstConstructor);
107+
analyzer, acc, name, desc, className, superName, isFirstConstructor, analyzer);
112108
if (name.equals("<init>"))
113109
isFirstConstructor = false;
114110
cloningMV.setClassVisitor(this);
115-
AnalyzerAdapter preAnalyzer = new AnalyzerAdapter(className, acc, name, desc, cloningMV);
116-
cloningMV.setPreAnalyzer(preAnalyzer);
117111

118-
JSRInlinerAdapter mv2 = new JSRInlinerAdapter(preAnalyzer, acc, name, desc, signature,
112+
JSRInlinerAdapter mv2 = new JSRInlinerAdapter(cloningMV, acc, name, desc, signature,
119113
exceptions);
120114
LocalVariablesSorter sorter = new LocalVariablesSorter(acc, desc, mv2);
121115
cloningMV.setLocalVariableSorter(sorter);
@@ -167,22 +161,29 @@ else if (mi.getOpcode() != Opcodes.INVOKESTATIC) {
167161
Type[] args = Type.getArgumentTypes(captureDesc);
168162
if (mi.name.equals("<init>")) {
169163
int j = 0;
164+
caa.visitVarInsn(ALOAD, 0);
165+
j++;
170166
for (int i = 0; i < args.length; i++) {
171167
caa.visitVarInsn(args[i].getOpcode(ILOAD), j);
172168
j+=args[i].getSize();
173169
}
174170
lvs.visitMethodInsn(Opcodes.INVOKESPECIAL, mi.owner, mi.name, mi.desc, mi.itf);
175171
caa.visitVarInsn(ALOAD, 0);
176172
} else {
173+
int j = 0;
177174
if ((opcode & Opcodes.ACC_STATIC) == 0)
175+
{
178176
caa.visitVarInsn(ALOAD, 0);
179-
for (int i = 0; i < args.length; i++) {
180-
caa.visitVarInsn(ALOAD, 0);
177+
j++;
181178
}
182-
lvs.visitMethodInsn(mi.getOpcode(), mi.owner, mi.name, mi.desc, mi.itf);
183-
int j = 0;
184-
for (int i = 0; i < args.length; i++) {
185-
if (args[i].getSort() == Type.ARRAY) {
179+
for (int i = 0; i < args.length; i++) {
180+
caa.visitVarInsn(args[i].getOpcode(ILOAD), j);
181+
j += args[i].getSize();
182+
}
183+
lvs.visitMethodInsn(mi.getOpcode(), mi.owner, mi.name, mi.desc, mi.itf);
184+
j = 0;
185+
for (int i = 0; i < args.length; i++) {
186+
if (args[i].getSort() == Type.ARRAY) {
186187
boolean minimalCopy = (Type.getReturnType(methodDesc).getSort() == Type.INT);
187188
if (minimalCopy) {
188189
caa.dup();

0 commit comments

Comments
 (0)