infrastructure
This commit is contained in:
committed by
Dmitry Petrov
parent
ca97f17cb6
commit
95c88e4445
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user