@@ -1692,17 +1692,17 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
16921692 def div (tk : TypeKind ) { emitPrimitive(divOpcodes, tk) }
16931693 def rem (tk : TypeKind ) { emitPrimitive(remOpcodes, tk) }
16941694
1695- def invokespecial (owner : String , name : String , desc : String ) {
1696- jmethod.visitMethodInsn(Opcodes .INVOKESPECIAL , owner, name, desc, false )
1695+ def invokespecial (owner : String , name : String , desc : String , itf : Boolean ) {
1696+ jmethod.visitMethodInsn(Opcodes .INVOKESPECIAL , owner, name, desc, itf )
16971697 }
1698- def invokestatic (owner : String , name : String , desc : String ) {
1699- jmethod.visitMethodInsn(Opcodes .INVOKESTATIC , owner, name, desc, false )
1698+ def invokestatic (owner : String , name : String , desc : String , itf : Boolean ) {
1699+ jmethod.visitMethodInsn(Opcodes .INVOKESTATIC , owner, name, desc, itf )
17001700 }
1701- def invokeinterface (owner : String , name : String , desc : String ) {
1702- jmethod.visitMethodInsn(Opcodes .INVOKEINTERFACE , owner, name, desc, true )
1701+ def invokeinterface (owner : String , name : String , desc : String , itf : Boolean ) {
1702+ jmethod.visitMethodInsn(Opcodes .INVOKEINTERFACE , owner, name, desc, itf )
17031703 }
1704- def invokevirtual (owner : String , name : String , desc : String ) {
1705- jmethod.visitMethodInsn(Opcodes .INVOKEVIRTUAL , owner, name, desc, false )
1704+ def invokevirtual (owner : String , name : String , desc : String , itf : Boolean ) {
1705+ jmethod.visitMethodInsn(Opcodes .INVOKEVIRTUAL , owner, name, desc, itf )
17061706 }
17071707
17081708 def goTo (label : asm.Label ) { jmethod.visitJumpInsn(Opcodes .GOTO , label) }
@@ -2190,15 +2190,20 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
21902190 jmethod.visitFieldInsn(asm.Opcodes .PUTSTATIC , thisName, strMODULE_INSTANCE_FIELD, thisDescr)
21912191 }
21922192 }
2193+ val itf = if (receiver.isJavaDefined)
2194+ (if (receiver.isModuleClass) receiver.linkedClassOfClass else receiver).isJavaInterface
2195+ else
2196+ receiver.isInterface
2197+ def checkInterfaceTarget () = if (itf && settings.target.value != " jvm-1.8" ) reporter.error(call.pos, " Static methods in interface require -target:jvm-1.8" )
21932198
21942199 style match {
2195- case Static (true ) => dbg(" invokespecial" ); jcode.invokespecial (jowner, jname, jtype)
2196- case Static (false ) => dbg(" invokestatic" ); jcode.invokestatic (jowner, jname, jtype)
2197- case Dynamic if needsInterfaceCall(receiver) => dbg(" invokinterface" ); jcode.invokeinterface(jowner, jname, jtype)
2198- case Dynamic => dbg(" invokevirtual" ); jcode.invokevirtual (jowner, jname, jtype)
2200+ case Static (true ) => dbg(" invokespecial" ); jcode.invokespecial (jowner, jname, jtype, itf )
2201+ case Static (false ) => dbg(" invokestatic" ); jcode.invokestatic (jowner, jname, jtype, itf); checkInterfaceTarget();
2202+ case Dynamic if needsInterfaceCall(receiver) => dbg(" invokinterface" ); jcode.invokeinterface(jowner, jname, jtype, itf )
2203+ case Dynamic => dbg(" invokevirtual" ); jcode.invokevirtual (jowner, jname, jtype, itf )
21992204 case SuperCall (_) =>
22002205 dbg(" invokespecial" )
2201- jcode.invokespecial(jowner, jname, jtype)
2206+ jcode.invokespecial(jowner, jname, jtype, itf )
22022207 initModule()
22032208 }
22042209 } // end of genCode()'s genCallMethod()
@@ -2331,11 +2336,11 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
23312336 def genObjsInstr () = (instr : @ unchecked) match {
23322337 case BOX (kind) =>
23332338 val MethodNameAndType (mname, mdesc) = jBoxTo(kind)
2334- jcode.invokestatic(BoxesRunTime , mname, mdesc)
2339+ jcode.invokestatic(BoxesRunTime , mname, mdesc, itf = false )
23352340
23362341 case UNBOX (kind) =>
23372342 val MethodNameAndType (mname, mdesc) = jUnboxTo(kind)
2338- jcode.invokestatic(BoxesRunTime , mname, mdesc)
2343+ jcode.invokestatic(BoxesRunTime , mname, mdesc, itf = false )
23392344
23402345 case NEW (REFERENCE (cls)) =>
23412346 val className = javaName(cls)
@@ -2373,7 +2378,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
23732378 /* Special handling to access native Array.clone() */
23742379 case call @ CALL_METHOD (definitions.Array_clone , Dynamic ) =>
23752380 val target : String = javaType(call.targetTypeKind).getInternalName
2376- jcode.invokevirtual(target, " clone" , mdesc_arrayClone)
2381+ jcode.invokevirtual(target, " clone" , mdesc_arrayClone, itf = false )
23772382
23782383 case call @ CALL_METHOD (method, style) => genCallMethod(call)
23792384
@@ -2718,7 +2723,8 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
27182723 jcode.invokespecial(
27192724 StringBuilderClassName ,
27202725 INSTANCE_CONSTRUCTOR_NAME ,
2721- mdesc_arglessvoid
2726+ mdesc_arglessvoid,
2727+ itf = false
27222728 )
27232729
27242730 case StringConcat (el) =>
@@ -2729,11 +2735,12 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
27292735 jcode.invokevirtual(
27302736 StringBuilderClassName ,
27312737 " append" ,
2732- asm.Type .getMethodDescriptor(StringBuilderType , Array (jtype): _* )
2738+ asm.Type .getMethodDescriptor(StringBuilderType , Array (jtype): _* ),
2739+ itf = false
27332740 )
27342741
27352742 case EndConcat =>
2736- jcode.invokevirtual(StringBuilderClassName , " toString" , mdesc_toString)
2743+ jcode.invokevirtual(StringBuilderClassName , " toString" , mdesc_toString, itf = false )
27372744
27382745 case _ => abort(" Unimplemented primitive " + primitive)
27392746 }
0 commit comments