Don't generate bodies of built-in stub methods into interfaces
This commit is contained in:
@@ -292,7 +292,7 @@ public class AsmUtil {
|
|||||||
: sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : type;
|
: sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void genThrow(MethodVisitor mv, String exception, String message) {
|
public static void genThrow(@NotNull MethodVisitor mv, @NotNull String exception, @NotNull String message) {
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
iv.anew(Type.getObjectType(exception));
|
iv.anew(Type.getObjectType(exception));
|
||||||
iv.dup();
|
iv.dup();
|
||||||
@@ -301,13 +301,6 @@ public class AsmUtil {
|
|||||||
iv.athrow();
|
iv.athrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void genMethodThrow(MethodVisitor mv, String exception, String message) {
|
|
||||||
mv.visitCode();
|
|
||||||
genThrow(mv, exception, message);
|
|
||||||
mv.visitMaxs(-1, -1);
|
|
||||||
mv.visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genClosureFields(CalculatedClosure closure, ClassBuilder v, JetTypeMapper typeMapper) {
|
public static void genClosureFields(CalculatedClosure closure, ClassBuilder v, JetTypeMapper typeMapper) {
|
||||||
ClassifierDescriptor captureThis = closure.getCaptureThis();
|
ClassifierDescriptor captureThis = closure.getCaptureThis();
|
||||||
int access = NO_FLAG_PACKAGE_PRIVATE | ACC_SYNTHETIC | ACC_FINAL;
|
int access = NO_FLAG_PACKAGE_PRIVATE | ACC_SYNTHETIC | ACC_FINAL;
|
||||||
|
|||||||
@@ -489,11 +489,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
|
|
||||||
private void generateToArray() {
|
private void generateToArray() {
|
||||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||||
if (isSubclass(descriptor, builtIns.getCollection())) {
|
if (!isSubclass(descriptor, builtIns.getCollection())) return;
|
||||||
if (CodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("toArray"), builtIns.getArray()) == null) {
|
|
||||||
MethodVisitor mv = v.getVisitor().visitMethod(ACC_PUBLIC, "toArray", "()[Ljava/lang/Object;", null, null);
|
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
|
||||||
|
|
||||||
|
int access = descriptor.getKind() == ClassKind.TRAIT ?
|
||||||
|
ACC_PUBLIC | ACC_ABSTRACT :
|
||||||
|
ACC_PUBLIC;
|
||||||
|
if (CodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("toArray"), builtIns.getArray()) == null) {
|
||||||
|
MethodVisitor mv = v.getVisitor().visitMethod(access, "toArray", "()[Ljava/lang/Object;", null, null);
|
||||||
|
|
||||||
|
if (descriptor.getKind() != ClassKind.TRAIT) {
|
||||||
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
|
|
||||||
iv.load(0, classAsmType);
|
iv.load(0, classAsmType);
|
||||||
@@ -502,11 +507,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
|
|
||||||
FunctionCodegen.endVisit(mv, "toArray", myClass);
|
FunctionCodegen.endVisit(mv, "toArray", myClass);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!isGenericToArrayPresent()) {
|
if (!isGenericToArrayPresent()) {
|
||||||
MethodVisitor mv = v.getVisitor().visitMethod(ACC_PUBLIC, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null);
|
MethodVisitor mv = v.getVisitor().visitMethod(access, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null);
|
||||||
|
|
||||||
|
if (descriptor.getKind() != ClassKind.TRAIT) {
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
|
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
|
|
||||||
iv.load(0, classAsmType);
|
iv.load(0, classAsmType);
|
||||||
@@ -528,8 +535,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
) {
|
) {
|
||||||
if (CodegenUtil.getDeclaredFunctionByRawSignature(
|
if (CodegenUtil.getDeclaredFunctionByRawSignature(
|
||||||
descriptor, Name.identifier(name), returnedClassifier, valueParameterClassifiers) == null) {
|
descriptor, Name.identifier(name), returnedClassifier, valueParameterClassifiers) == null) {
|
||||||
MethodVisitor mv = v.getVisitor().visitMethod(ACC_PUBLIC, name, desc, null, null);
|
int access = descriptor.getKind() == ClassKind.TRAIT ?
|
||||||
AsmUtil.genMethodThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection");
|
ACC_PUBLIC | ACC_ABSTRACT :
|
||||||
|
ACC_PUBLIC;
|
||||||
|
MethodVisitor mv = v.getVisitor().visitMethod(access, name, desc, null, null);
|
||||||
|
if (descriptor.getKind() != ClassKind.TRAIT) {
|
||||||
|
mv.visitCode();
|
||||||
|
genThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection");
|
||||||
|
FunctionCodegen.endVisit(mv, "built-in stub for " + name + desc, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
trait A : Collection<String>
|
||||||
|
trait B : List<String>
|
||||||
|
trait C : Map<Long, Double>
|
||||||
|
trait D : Map.Entry<Any, Nothing>
|
||||||
|
trait E : Iterator<Int>
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
trait F : A, B, C, D, E
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -477,6 +477,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest("compiler/testData/codegen/box/builtinStubMethods/Collection.kt");
|
doTest("compiler/testData/codegen/box/builtinStubMethods/Collection.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("dontGenerateBodyInTrait.kt")
|
||||||
|
public void testDontGenerateBodyInTrait() throws Exception {
|
||||||
|
doTest("compiler/testData/codegen/box/builtinStubMethods/dontGenerateBodyInTrait.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("Iterator.kt")
|
@TestMetadata("Iterator.kt")
|
||||||
public void testIterator() throws Exception {
|
public void testIterator() throws Exception {
|
||||||
doTest("compiler/testData/codegen/box/builtinStubMethods/Iterator.kt");
|
doTest("compiler/testData/codegen/box/builtinStubMethods/Iterator.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user