diff --git a/compiler/backend/backend.iml b/compiler/backend/backend.iml
index 337b0497f71..35bbf202424 100644
--- a/compiler/backend/backend.iml
+++ b/compiler/backend/backend.iml
@@ -14,5 +14,6 @@
+
\ No newline at end of file
diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
index 1ad8eeb1282..e7805d49baf 100644
--- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
+++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
@@ -523,7 +523,7 @@ public class AsmUtil {
mv.visitInsn(L2I);
}
- static void genInvertBoolean(InstructionAdapter v) {
+ public static void genInvertBoolean(InstructionAdapter v) {
v.iconst(1);
v.xor(Type.INT_TYPE);
}
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ExpressionCodegen.kt
index 3ab99facb85..288f1a52fd8 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ExpressionCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ExpressionCodegen.kt
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.jvm.intrinsics.IntrinsicMethods
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicFunction
+import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
import org.jetbrains.kotlin.codegen.BranchedValue
import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.FrameMap
@@ -28,6 +29,7 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.*
+import org.jetbrains.kotlin.ir.expressions.impl.IrIfThenElseImpl
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
@@ -38,8 +40,6 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
class BlockInfo {
val variables: MutableList = mutableListOf()
}
-/*TODO*/
-val intrinsics = IntrinsicMethods()
class VariableInfo(val name: String, val index: Int, val type: Type, val startLabel: Label)
@@ -50,6 +50,9 @@ class ExpressionCodegen(
val classCodegen: JvmClassCodegen
) : IrElementVisitor {
+ /*TODO*/
+ val intrinsics = IrIntrinsicMethods(classCodegen.context.irBuiltIns)
+
val typeMapper = classCodegen.typeMapper
fun generate() {
@@ -106,11 +109,15 @@ class ExpressionCodegen(
return expression.onStack
}
+ override fun visitMemberAccess(expression: IrMemberAccessExpression, data: BlockInfo): StackValue {
+ return generateCall(expression, null, data)
+ }
+
override fun visitCall(expression: IrCall, data: BlockInfo): StackValue {
return generateCall(expression, expression.superQualifier, data)
}
- private fun generateCall(expression: IrCall, superQualifier: ClassDescriptor?, data: BlockInfo): StackValue {
+ private fun generateCall(expression: IrMemberAccessExpression, superQualifier: ClassDescriptor?, data: BlockInfo): StackValue {
val callable = resolveToCallable(expression, superQualifier != null)
if (callable is IrIntrinsicFunction) {
callable.invoke(mv, this, data)
@@ -227,7 +234,8 @@ class ExpressionCodegen(
override fun visitWhen(expression: IrWhen, data: BlockInfo): StackValue {
- if (IrStatementOrigin.IF == expression.origin) {
+ /*TODO */
+ if (expression is IrIfThenElseImpl) {
val elseLabel = Label()
val condition = expression.getNthCondition(0)!!
gen(condition, data)
@@ -277,7 +285,7 @@ class ExpressionCodegen(
val IrExpression.onStack: StackValue
get() = StackValue.onStack(this.asmType)
- private fun resolveToCallable(irCall: IrCall, isSuper: Boolean): Callable {
+ private fun resolveToCallable(irCall: IrMemberAccessExpression, isSuper: Boolean): Callable {
val intrinsic = intrinsics.getIntrinsic(irCall.descriptor as CallableMemberDescriptor)
if (intrinsic != null) {
return intrinsic.toCallable(irCall, typeMapper.mapSignatureSkipGeneric(irCall.descriptor as FunctionDescriptor), classCodegen.context)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/FunctionCodegen.kt
index 46aebd43922..f15ba59f80f 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/FunctionCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/FunctionCodegen.kt
@@ -35,9 +35,10 @@ class FunctionCodegen(val irFunction: IrFunction, val classCodegen: JvmClassCode
classCodegen.state, irFunction.descriptor, signature,
isStatic
)
+
val methodVisitor = classCodegen.visitor.newMethod(irFunction.OtherOrigin,
irFunction.descriptor.calculateCommonFlags().or(if (isStatic) ACC_STATIC else 0),
- irFunction.descriptor.name.asString(), signature.asmMethod.descriptor,
+ signature.asmMethod.name, signature.asmMethod.descriptor,
signature.genericsSignature, null/*TODO support exception*/)
ExpressionCodegen(irFunction, frameMap, InstructionAdapter(methodVisitor), classCodegen).generate()
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
index ba6c2dd8b10..b3c54a25220 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
@@ -18,8 +18,10 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.jvm.lower.JvmFileClassProvider
import org.jetbrains.kotlin.codegen.state.GenerationState
+import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
class JvmBackendContext(
val state: GenerationState,
- val jvmFileClassProvider: JvmFileClassProvider
+ val jvmFileClassProvider: JvmFileClassProvider,
+ val irBuiltIns: IrBuiltIns
)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
index eb4df96faa0..5cd1c5de8f4 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.jvm.lower.JvmFileClassProvider
import org.jetbrains.kotlin.codegen.CompilationErrorHandler
import org.jetbrains.kotlin.codegen.state.GenerationState
+import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
@@ -37,7 +38,7 @@ object JvmBackendFacade {
val psi2ir = Psi2IrTranslator()
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext)
- val jvmBackendContext = createJvmBackendContext(psi2ir, state)
+ val jvmBackendContext = createJvmBackendContext(psi2ir, state, psi2irContext.irBuiltIns)
val jvmBackend = JvmBackend(jvmBackendContext)
@@ -54,11 +55,11 @@ object JvmBackendFacade {
}
}
- fun createJvmBackendContext(psi2ir: Psi2IrTranslator, state: GenerationState): JvmBackendContext {
+ fun createJvmBackendContext(psi2ir: Psi2IrTranslator, state: GenerationState, irBuiltIns: IrBuiltIns): JvmBackendContext {
val jvmFileClassProvider = JvmFileClassProvider()
psi2ir.add(jvmFileClassProvider)
- val jvmBackendContext = JvmBackendContext(state, jvmFileClassProvider)
+ val jvmBackendContext = JvmBackendContext(state, jvmFileClassProvider, irBuiltIns)
return jvmBackendContext
}
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmClassCodegen.kt
index 065d6bf746c..7bbfa5c3465 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmClassCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmClassCodegen.kt
@@ -151,7 +151,9 @@ class JvmClassCodegen private constructor(val irClass: IrClass, val context: Jvm
}
fun ClassDescriptor.calculateClassFlags(): Int {
- return Opcodes.ACC_SUPER.or(calculateCommonFlags()).or(if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else 0)
+ return (if (!DescriptorUtils.isInterface(this)) Opcodes.ACC_SUPER else 0).
+ or(calculateCommonFlags()).
+ or(if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else 0)
}
fun MemberDescriptor.calculateCommonFlags(): Int {