Move common declarations up
This commit is contained in:
+47
-44
@@ -125,6 +125,53 @@ class ExpressionCodegen(
|
|||||||
|
|
||||||
private val fileEntry = sourceManager.getFileEntry(irFunction.fileParent)
|
private val fileEntry = sourceManager.getFileEntry(irFunction.fileParent)
|
||||||
|
|
||||||
|
private val KotlinType.asmType: Type
|
||||||
|
get() = typeMapper.mapType(this)
|
||||||
|
|
||||||
|
private val IrType.asmType: Type
|
||||||
|
get() = toKotlinType().asmType
|
||||||
|
|
||||||
|
private val CallableDescriptor.asmType: Type
|
||||||
|
get() = typeMapper.mapType(this)
|
||||||
|
|
||||||
|
private val IrExpression.asmType: Type
|
||||||
|
get() = type.asmType
|
||||||
|
|
||||||
|
val IrExpression.onStack: StackValue
|
||||||
|
get() = StackValue.onStack(asmType, type.toKotlinType())
|
||||||
|
|
||||||
|
private fun StackValue.discard(): StackValue {
|
||||||
|
coerce(type, Type.VOID_TYPE, mv)
|
||||||
|
return none()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun StackValue.coerce(toKotlinType: KotlinType): StackValue {
|
||||||
|
coerce(type, kotlinType, toKotlinType.asmType, toKotlinType, mv)
|
||||||
|
return onStack(toKotlinType.asmType, toKotlinType)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun coerceNotToUnit(fromType: Type, fromKotlinType: KotlinType?, toKotlinType: KotlinType): StackValue {
|
||||||
|
// A void should still be materialized as a Unit to avoid stack depth mismatches.
|
||||||
|
if (toKotlinType.isUnit() && fromType != Type.VOID_TYPE)
|
||||||
|
return onStack(fromType, fromKotlinType)
|
||||||
|
return onStack(fromType, fromKotlinType).coerce(toKotlinType)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun markNewLabel() = Label().apply { mv.visitLabel(this) }
|
||||||
|
|
||||||
|
private fun IrElement.markLineNumber(startOffset: Boolean) {
|
||||||
|
val offset = if (startOffset) this.startOffset else endOffset
|
||||||
|
if (offset < 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val lineNumber = fileEntry.getLineNumber(offset) + 1
|
||||||
|
assert(lineNumber > 0)
|
||||||
|
if (lastLineNumber != lineNumber) {
|
||||||
|
lastLineNumber = lineNumber
|
||||||
|
mv.visitLineNumber(lineNumber, markNewLabel())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun generate() {
|
fun generate() {
|
||||||
mv.visitCode()
|
mv.visitCode()
|
||||||
val startLabel = markNewLabel()
|
val startLabel = markNewLabel()
|
||||||
@@ -196,11 +243,6 @@ class ExpressionCodegen(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun StackValue.discard(): StackValue {
|
|
||||||
coerce(type, Type.VOID_TYPE, mv)
|
|
||||||
return none()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitBlock(expression: IrBlock, data: BlockInfo): StackValue {
|
override fun visitBlock(expression: IrBlock, data: BlockInfo): StackValue {
|
||||||
val info = data.create()
|
val info = data.create()
|
||||||
return super.visitBlock(expression, info).apply {
|
return super.visitBlock(expression, info).apply {
|
||||||
@@ -1171,22 +1213,6 @@ class ExpressionCodegen(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun coerceNotToUnit(fromType: Type, fromKotlinType: KotlinType?, toKotlinType: KotlinType): StackValue {
|
|
||||||
val asmToType = toKotlinType.asmType
|
|
||||||
// A void should still be materialized as a Unit to avoid stack depth mismatches.
|
|
||||||
if (asmToType != AsmTypes.UNIT_TYPE || fromType == Type.VOID_TYPE || TypeUtils.isNullableType(toKotlinType)) {
|
|
||||||
coerce(fromType, fromKotlinType, asmToType, toKotlinType, mv)
|
|
||||||
return onStack(asmToType, toKotlinType)
|
|
||||||
}
|
|
||||||
return onStack(fromType, fromKotlinType)
|
|
||||||
}
|
|
||||||
|
|
||||||
val IrExpression.asmType: Type
|
|
||||||
get() = typeMapper.mapType(this.type.toKotlinType())
|
|
||||||
|
|
||||||
val IrExpression.onStack: StackValue
|
|
||||||
get() = StackValue.onStack(this.asmType)
|
|
||||||
|
|
||||||
private fun resolveToCallable(irCall: IrMemberAccessExpression, isSuper: Boolean): Callable {
|
private fun resolveToCallable(irCall: IrMemberAccessExpression, isSuper: Boolean): Callable {
|
||||||
val intrinsic = intrinsics.getIntrinsic(irCall.descriptor.original as CallableMemberDescriptor)
|
val intrinsic = intrinsics.getIntrinsic(irCall.descriptor.original as CallableMemberDescriptor)
|
||||||
if (intrinsic != null) {
|
if (intrinsic != null) {
|
||||||
@@ -1216,13 +1242,6 @@ class ExpressionCodegen(
|
|||||||
return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper)
|
return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val KotlinType.asmType: Type
|
|
||||||
get() = typeMapper.mapType(this)
|
|
||||||
|
|
||||||
private val CallableDescriptor.asmType: Type
|
|
||||||
get() = typeMapper.mapType(this)
|
|
||||||
|
|
||||||
|
|
||||||
private fun getOrCreateCallGenerator(
|
private fun getOrCreateCallGenerator(
|
||||||
descriptor: CallableDescriptor,
|
descriptor: CallableDescriptor,
|
||||||
element: IrMemberAccessExpression?,
|
element: IrMemberAccessExpression?,
|
||||||
@@ -1312,22 +1331,6 @@ class ExpressionCodegen(
|
|||||||
override fun markLineNumberAfterInlineIfNeeded() {
|
override fun markLineNumberAfterInlineIfNeeded() {
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun markNewLabel() = Label().apply { mv.visitLabel(this) }
|
|
||||||
|
|
||||||
private fun IrElement.markLineNumber(startOffset: Boolean) {
|
|
||||||
val offset = if (startOffset) this.startOffset else endOffset
|
|
||||||
if (offset < 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
val lineNumber = fileEntry.getLineNumber(offset) + 1
|
|
||||||
assert(lineNumber > 0)
|
|
||||||
if (lastLineNumber == lineNumber) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
lastLineNumber = lineNumber
|
|
||||||
mv.visitLineNumber(lineNumber, markNewLabel())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun DefaultCallArgs.generateOnStackIfNeeded(callGenerator: IrCallGenerator, isConstructor: Boolean, codegen: ExpressionCodegen): Boolean {
|
fun DefaultCallArgs.generateOnStackIfNeeded(callGenerator: IrCallGenerator, isConstructor: Boolean, codegen: ExpressionCodegen): Boolean {
|
||||||
|
|||||||
Reference in New Issue
Block a user