diff --git a/PlayOutAgent/rtlib/de/bodden/tamiflex/playout/rt/ReflLogger.java b/PlayOutAgent/rtlib/de/bodden/tamiflex/playout/rt/ReflLogger.java index 48a7cd9..96c640d 100644 --- a/PlayOutAgent/rtlib/de/bodden/tamiflex/playout/rt/ReflLogger.java +++ b/PlayOutAgent/rtlib/de/bodden/tamiflex/playout/rt/ReflLogger.java @@ -160,24 +160,17 @@ public static void constructorMethodInvoke(Constructor c, Kind constructorMet try { StackTraceElement frame = getInvokingFrame(); String[] paramTypes = classesToTypeNames(c.getParameterTypes()); - String className = c.getDeclaringClass().getName(); - // If this is a lambda proxy class the className comes out in the form: - // ".$$Lambda$/", - // however, when we take its byte code to generate the class name (as happens when we - // dump the classes to disk) the name does not contain the "/". - // This logic below is to remove the hash code so the reflection log entries match - // the classes that are dumped and soot can process them. - if (className.contains("$$Lambda$")) + String declareClassName = c.getDeclaringClass().getName(); + // Lambda's declaring class name comes out as: ".$$Lambda$/", + // however we write out the lambda class as ".$$Lambda$.class" + // We need to remove "/" so the reflection log entry matches the class file name. + if (declareClassName.contains("$$Lambda$")) { - String slashHashCode = "/" + c.getDeclaringClass().hashCode(); - if (!className.endsWith(slashHashCode)) { - System.err.println("unexpected lambda proxy class: " + className); - } - else { - className = className.substring(0, className.length() - slashHashCode.length()); - } + int ignoreStart = declareClassName.lastIndexOf('/'); + if (ignoreStart != -1) + declareClassName = declareClassName.substring(0, ignoreStart); } - logAndIncrementTargetMethodEntry(frame.getClassName()+"."+frame.getMethodName(),frame.getLineNumber(),constructorMethodKind,className,"void","", c.isAccessible(), paramTypes); + logAndIncrementTargetMethodEntry(frame.getClassName()+"."+frame.getMethodName(),frame.getLineNumber(),constructorMethodKind,declareClassName,"void","", c.isAccessible(), paramTypes); } finally { leavingReflectionAPI(); diff --git a/PlayOutAgent/src/de/bodden/tamiflex/playout/ReflectionMonitor.java b/PlayOutAgent/src/de/bodden/tamiflex/playout/ReflectionMonitor.java index f789f16..2d25780 100644 --- a/PlayOutAgent/src/de/bodden/tamiflex/playout/ReflectionMonitor.java +++ b/PlayOutAgent/src/de/bodden/tamiflex/playout/ReflectionMonitor.java @@ -77,7 +77,7 @@ public byte[] transform(ClassLoader loader, String className, try { final ClassReader creader = new ClassReader(classfileBuffer); - final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); ClassVisitor visitor = writer; for (AbstractTransformation transformation : transformations)