Skip to content

Commit b389359

Browse files
udalovSpace Team
authored andcommitted
JVM: refactor IntrinsicMethod and subclasses
- Introduce `CallBasedIntrinsicMethod` to avoid having TODO in `toCallable` - Simplify `IrIllegalArgumentException` and `RangeTo` to avoid overriding both `toCallable` and `invoke`
1 parent 2c773db commit b389359

27 files changed

+80
-110
lines changed

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2323
import org.jetbrains.kotlin.ir.util.parentAsClass
2424
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2525

26-
object ArrayIterator : IntrinsicMethod() {
26+
object ArrayIterator : CallBasedIntrinsicMethod() {
2727
override fun toCallable(
2828
expression: IrFunctionAccessExpression,
2929
signature: JvmMethodSignature,

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySize.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
2020
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2121
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2222

23-
object ArraySize : IntrinsicMethod() {
23+
object ArraySize : CallBasedIntrinsicMethod() {
2424
override fun toCallable(
2525
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
2626
): IntrinsicFunction {

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/AtomicCompareAndExchange.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics
88
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
99
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
1010
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
11-
import org.jetbrains.org.objectweb.asm.Type.INT
12-
import org.jetbrains.org.objectweb.asm.Type.LONG
13-
import org.jetbrains.org.objectweb.asm.Type.BOOLEAN
14-
import org.jetbrains.org.objectweb.asm.Type.OBJECT
11+
import org.jetbrains.org.objectweb.asm.Type.*
1512

16-
class AtomicCompareAndExchange(private val valueType: Int) : IntrinsicMethod() {
13+
class AtomicCompareAndExchange(private val valueType: Int) : CallBasedIntrinsicMethod() {
1714
override fun toCallable(
1815
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
1916
): IntrinsicFunction {
@@ -30,7 +27,7 @@ class AtomicCompareAndExchange(private val valueType: Int) : IntrinsicMethod() {
3027
}
3128
}
3229

33-
class AtomicArrayCompareAndExchange(private val valueType: Int) : IntrinsicMethod() {
30+
class AtomicArrayCompareAndExchange(private val valueType: Int) : CallBasedIntrinsicMethod() {
3431
override fun toCallable(
3532
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
3633
): IntrinsicFunction {
@@ -44,4 +41,4 @@ class AtomicArrayCompareAndExchange(private val valueType: Int) : IntrinsicMetho
4441
it.invokestatic("kotlin/concurrent/internal/AtomicIntrinsicsKt", "compareAndExchange", descriptor, false)
4542
}
4643
}
47-
}
44+
}

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2727
import org.jetbrains.org.objectweb.asm.Opcodes.*
2828
import org.jetbrains.org.objectweb.asm.Type
2929

30-
class BinaryOp(private val opcode: Int) : IntrinsicMethod() {
30+
class BinaryOp(private val opcode: Int) : CallBasedIntrinsicMethod() {
3131
private fun shift(): Boolean =
3232
opcode == ISHL || opcode == ISHR || opcode == IUSHR
3333

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.backend.jvm.intrinsics
7+
8+
import org.jetbrains.kotlin.backend.jvm.codegen.*
9+
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
10+
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
11+
12+
abstract class CallBasedIntrinsicMethod : IntrinsicMethod() {
13+
abstract fun toCallable(
14+
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
15+
): IntrinsicFunction
16+
17+
final override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? {
18+
val descriptor = codegen.methodSignatureMapper.mapSignatureSkipGeneric(expression.symbol.owner)
19+
val callable = toCallable(expression, descriptor, codegen.classCodegen)
20+
callable.invoke(codegen.mv, codegen, data, expression)
21+
return MaterialValue(codegen, callable.signature.returnType, expression.type)
22+
}
23+
}

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2424
import org.jetbrains.org.objectweb.asm.Opcodes
2525
import org.jetbrains.org.objectweb.asm.Type
2626

27-
object Clone : IntrinsicMethod() {
28-
27+
object Clone : CallBasedIntrinsicMethod() {
2928
private val CLONEABLE_TYPE = Type.getObjectType("java/lang/Cloneable")
3029

3130
override fun toCallable(

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes
3737
import org.jetbrains.org.objectweb.asm.Type
3838
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
3939

40-
object CompareTo : IntrinsicMethod() {
40+
object CompareTo : CallBasedIntrinsicMethod() {
4141
private fun genInvoke(type: Type?, v: InstructionAdapter) {
4242
when (type) {
4343
Type.CHAR_TYPE, Type.BYTE_TYPE, Type.SHORT_TYPE, Type.INT_TYPE ->

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class Equals(val operator: IElementType) : IntrinsicMethod() {
165165
}
166166

167167

168-
class Ieee754Equals(val operandType: Type) : IntrinsicMethod() {
168+
class Ieee754Equals(val operandType: Type) : CallBasedIntrinsicMethod() {
169169
private val boxedOperandType = AsmUtil.boxType(operandType)
170170

171171
override fun toCallable(

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Increment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.codegen.StackValue
2222
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2323
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
2424

25-
class Increment(private val myDelta: Int) : IntrinsicMethod() {
25+
class Increment(private val myDelta: Int) : CallBasedIntrinsicMethod() {
2626
override fun toCallable(
2727
expression: IrFunctionAccessExpression, signature: JvmMethodSignature, classCodegen: ClassCodegen,
2828
): IntrinsicFunction {

compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicFunction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ abstract class IntrinsicFunction(
2828
) {
2929
abstract fun genInvokeInstruction(v: InstructionAdapter)
3030

31-
open fun invoke(
31+
fun invoke(
3232
v: InstructionAdapter,
3333
codegen: ExpressionCodegen,
3434
data: BlockInfo,

0 commit comments

Comments
 (0)