From 95c88e4445e1bf94a751953c922a79c5392b8339 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 21 Sep 2016 12:12:18 +0300 Subject: [PATCH] infrastructure --- compiler/backend/backend.iml | 1 + .../org/jetbrains/kotlin/codegen/AsmUtil.java | 2 +- .../kotlin/backend/jvm/ExpressionCodegen.kt | 18 +++++++++++++----- .../kotlin/backend/jvm/FunctionCodegen.kt | 3 ++- .../kotlin/backend/jvm/JvmBackendContext.kt | 4 +++- .../kotlin/backend/jvm/JvmBackendFacade.kt | 7 ++++--- .../kotlin/backend/jvm/JvmClassCodegen.kt | 4 +++- 7 files changed, 27 insertions(+), 12 deletions(-) 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 {