Minor improvements to inline tests
This commit is contained in:
@@ -16,13 +16,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.Ref;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import groovyjarjarasm.asm.Opcodes;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.asm4.*;
|
|
||||||
import org.jetbrains.asm4.tree.MethodNode;
|
|
||||||
import org.jetbrains.jet.OutputFile;
|
import org.jetbrains.jet.OutputFile;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||||
|
import org.jetbrains.org.objectweb.asm.*;
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -34,9 +34,8 @@ public class InlineTestUtil {
|
|||||||
public static final String INLINE_ANNOTATION_CLASS = "kotlin/inline";
|
public static final String INLINE_ANNOTATION_CLASS = "kotlin/inline";
|
||||||
|
|
||||||
public static void checkNoCallsToInline(List<OutputFile> files) {
|
public static void checkNoCallsToInline(List<OutputFile> files) {
|
||||||
//final HashMap<Type> inlineMethods = new HashMap();
|
|
||||||
Set<MethodInfo> inlinedMethods = collectInlineMethods(files);
|
Set<MethodInfo> inlinedMethods = collectInlineMethods(files);
|
||||||
assert !inlinedMethods.isEmpty() : "There is no any inline method";
|
assert !inlinedMethods.isEmpty() : "There are no inline methods";
|
||||||
|
|
||||||
List<NotInlinedCall> notInlinedCalls = checkInlineNotInvoked(files, inlinedMethods);
|
List<NotInlinedCall> notInlinedCalls = checkInlineNotInvoked(files, inlinedMethods);
|
||||||
assert notInlinedCalls.isEmpty() : "All inline methods should be inlined but " + StringUtil.join(notInlinedCalls, "\n");
|
assert notInlinedCalls.isEmpty() : "All inline methods should be inlined but " + StringUtil.join(notInlinedCalls, "\n");
|
||||||
@@ -52,18 +51,19 @@ public class InlineTestUtil {
|
|||||||
cr.accept(new ClassVisitor(Opcodes.ASM4) {
|
cr.accept(new ClassVisitor(Opcodes.ASM4) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
|
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
|
||||||
className[0] = name;
|
className[0] = name;
|
||||||
super.visit(version, access, name, signature, superName, interfaces);
|
super.visit(version, access, name, signature, superName, interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MethodVisitor visitMethod(
|
public MethodVisitor visitMethod(
|
||||||
int access, String name, String desc, String signature, String[] exceptions
|
int access, @NotNull String name, @NotNull String desc, String signature, String[] exceptions
|
||||||
) {
|
) {
|
||||||
return new MethodNode(Opcodes.ASM4, access, name, desc, signature, exceptions) {
|
return new MethodNode(Opcodes.ASM4, access, name, desc, signature, exceptions) {
|
||||||
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
|
public AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) {
|
||||||
Type type = Type.getType(desc);
|
Type type = Type.getType(desc);
|
||||||
String annotationClass = type.getInternalName();
|
String annotationClass = type.getInternalName();
|
||||||
if (INLINE_ANNOTATION_CLASS.equals(annotationClass)) {
|
if (INLINE_ANNOTATION_CLASS.equals(annotationClass)) {
|
||||||
@@ -84,26 +84,24 @@ public class InlineTestUtil {
|
|||||||
for (OutputFile file : files) {
|
for (OutputFile file : files) {
|
||||||
ClassReader cr = new ClassReader(file.asByteArray());
|
ClassReader cr = new ClassReader(file.asByteArray());
|
||||||
|
|
||||||
final String[] className = {null};
|
final Ref<String> className = Ref.create();
|
||||||
cr.accept(new ClassVisitor(Opcodes.ASM4) {
|
cr.accept(new ClassVisitor(Opcodes.ASM4) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
|
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
|
||||||
className[0] = name;
|
className.set(name);
|
||||||
super.visit(version, access, name, signature, superName, interfaces);
|
super.visit(version, access, name, signature, superName, interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MethodVisitor visitMethod(
|
public MethodVisitor visitMethod(
|
||||||
int access, String name, String desc, String signature, String[] exceptions
|
int access, @NotNull String name, @NotNull String desc, String signature, String[] exceptions
|
||||||
) {
|
) {
|
||||||
return new MethodNode(Opcodes.ASM4, access, name, desc, signature, exceptions) {
|
return new MethodNode(Opcodes.ASM4, access, name, desc, signature, exceptions) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
|
public void visitMethodInsn(int opcode, @NotNull String owner, String name, @NotNull String desc, boolean itf) {
|
||||||
MethodInfo methodCall = new MethodInfo(owner, name, desc);
|
MethodInfo methodCall = new MethodInfo(owner, name, desc);
|
||||||
if (inlinedMethods.contains(methodCall)) {
|
if (inlinedMethods.contains(methodCall)) {
|
||||||
MethodInfo fromCall = new MethodInfo(className[0], this.name, this.desc);
|
MethodInfo fromCall = new MethodInfo(className.get(), this.name, this.desc);
|
||||||
//skip facades
|
//skip facades
|
||||||
if (methodCall.owner.startsWith(fromCall.owner + "-")) {
|
if (methodCall.owner.startsWith(fromCall.owner + "-")) {
|
||||||
return;
|
return;
|
||||||
@@ -119,13 +117,12 @@ public class InlineTestUtil {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return notInlined;
|
return notInlined;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NotInlinedCall {
|
private static class NotInlinedCall {
|
||||||
|
|
||||||
public final MethodInfo fromCall;
|
public final MethodInfo fromCall;
|
||||||
public final MethodInfo inlineMethod;
|
public final MethodInfo inlineMethod;
|
||||||
|
|
||||||
@@ -143,8 +140,7 @@ public class InlineTestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MethodInfo {
|
private static class MethodInfo {
|
||||||
|
|
||||||
private final String owner;
|
private final String owner;
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String desc;
|
private final String desc;
|
||||||
|
|||||||
@@ -96,7 +96,13 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
|||||||
inputFiles.add(firstFileName.substring(0, firstFileName.length() - "1.kt".length()) + "2.kt");
|
inputFiles.add(firstFileName.substring(0, firstFileName.length() - "1.kt".length()) + "2.kt");
|
||||||
|
|
||||||
doTestMultiFile(inputFiles);
|
doTestMultiFile(inputFiles);
|
||||||
InlineTestUtil.checkNoCallsToInline(initializedClassLoader.getAllGeneratedFiles());
|
try {
|
||||||
|
InlineTestUtil.checkNoCallsToInline(initializedClassLoader.getAllGeneratedFiles());
|
||||||
|
}
|
||||||
|
catch (Throwable e) {
|
||||||
|
System.out.println(generateToText());
|
||||||
|
throw UtilsPackage.rethrow(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void blackBoxFileAgainstJavaByFullPath(@NotNull String ktFileFullPath) {
|
private void blackBoxFileAgainstJavaByFullPath(@NotNull String ktFileFullPath) {
|
||||||
|
|||||||
Reference in New Issue
Block a user