infrastructure

This commit is contained in:
Michael Bogdanov
2016-09-21 12:12:18 +03:00
committed by Dmitry Petrov
parent ca97f17cb6
commit 95c88e4445
7 changed files with 27 additions and 12 deletions
+1
View File
@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="backend-common" exported="" />
<orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="backend.jvm" />
<orderEntry type="module" module-name="ir.tree" />
</component>
</module>
@@ -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);
}
@@ -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<VariableInfo> = 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<StackValue, BlockInfo> {
/*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)
@@ -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()
@@ -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
)
@@ -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
}
@@ -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 {