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() {
override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
val type = AsmUtil.correctElementType(calcReceiverType(expression, context))
return IrIntrinsicFunction.create(expression, signature, context, listOf(calcReceiverType(expression, context), Type.INT_TYPE)) {
it.aload(type)
val arrayType = calcReceiverType(expression, context)
val elementType = AsmUtil.correctElementType(arrayType)
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
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.org.objectweb.asm.Type
class ArraySet : IntrinsicMethod() {
/*TODO return type, types*/
override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
val type = expressionType(expression.dispatchReceiver!!, context)
return IrIntrinsicFunction.create(expression, signature, context) {
it.astore(signature.valueParameters.last().asmType)
val arrayType = expressionType(expression.dispatchReceiver!!, context)
val elementType = AsmUtil.correctElementType(arrayType)
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)
}
}
}*/
}