Fix array element processing

This commit is contained in:
Mikhael Bogdanov
2017-06-02 10:33:02 +02:00
parent 5bba5b2fb7
commit 5dfe77b7c3
2 changed files with 10 additions and 21 deletions
@@ -24,9 +24,10 @@ import org.jetbrains.org.objectweb.asm.Type
class ArrayGet : IntrinsicMethod() { class ArrayGet : IntrinsicMethod() {
override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
val type = AsmUtil.correctElementType(calcReceiverType(expression, context)) val arrayType = calcReceiverType(expression, context)
return IrIntrinsicFunction.create(expression, signature, context, listOf(calcReceiverType(expression, context), Type.INT_TYPE)) { val elementType = AsmUtil.correctElementType(arrayType)
it.aload(type) return IrIntrinsicFunction.create(expression, signature.newReturnType(elementType), context, listOf(arrayType, Type.INT_TYPE)) {
it.aload(elementType)
} }
} }
} }
@@ -17,30 +17,18 @@
package org.jetbrains.kotlin.backend.jvm.intrinsics package org.jetbrains.kotlin.backend.jvm.intrinsics
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.org.objectweb.asm.Type
class ArraySet : IntrinsicMethod() { class ArraySet : IntrinsicMethod() {
/*TODO return type, types*/
override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
val type = expressionType(expression.dispatchReceiver!!, context) val arrayType = expressionType(expression.dispatchReceiver!!, context)
return IrIntrinsicFunction.create(expression, signature, context) { val elementType = AsmUtil.correctElementType(arrayType)
it.astore(signature.valueParameters.last().asmType) return IrIntrinsicFunction.create(expression, signature, context, listOf(arrayType, Type.INT_TYPE, elementType)) {
it.astore(elementType)
} }
} }
/*override fun toCallable(method: CallableMethod): Callable {
val type = correctElementType(method.dispatchReceiverType)
return object : IntrinsicCallable(
Type.VOID_TYPE,
listOf(Type.INT_TYPE, type),
method.dispatchReceiverType,
method.extensionReceiverType
) {
override fun invokeIntrinsic(v: InstructionAdapter) {
v.astore(type)
}
}
}*/
} }