Rename thisType and receiverType to dispatch and extension ones
This commit is contained in:
@@ -28,15 +28,15 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
|||||||
public trait Callable {
|
public trait Callable {
|
||||||
public val owner: Type
|
public val owner: Type
|
||||||
|
|
||||||
public val thisType: Type?
|
public val dispatchReceiverType: Type?
|
||||||
|
|
||||||
public val receiverType: Type?
|
public val extensionReceiverType: Type?
|
||||||
|
|
||||||
public val generateCalleeType: Type?
|
public val generateCalleeType: Type?
|
||||||
|
|
||||||
public val valueParameterTypes: List<Type>
|
public val valueParameterTypes: List<Type>
|
||||||
|
|
||||||
public val argumentTypes: Array<Type>
|
public val parameterTypes: Array<Type>
|
||||||
|
|
||||||
public val returnType: Type
|
public val returnType: Type
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import org.jetbrains.org.objectweb.asm.util.Printer;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class CallableMethod(override val owner: Type, private val defaultImplOwner: Type?, private val defaultImplParam: Type?, private val signature: JvmMethodSignature, private val invokeOpcode: Int, override val thisType: Type?, override val receiverType: Type?, override val generateCalleeType: Type?) : Callable {
|
public class CallableMethod(override val owner: Type, private val defaultImplOwner: Type?, private val defaultImplParam: Type?, private val signature: JvmMethodSignature, private val invokeOpcode: Int, override val dispatchReceiverType: Type?, override val extensionReceiverType: Type?, override val generateCalleeType: Type?) : Callable {
|
||||||
|
|
||||||
public fun getValueParameters(): List<JvmMethodParameterSignature> {
|
public fun getValueParameters(): List<JvmMethodParameterSignature> {
|
||||||
return signature.getValueParameters()
|
return signature.getValueParameters()
|
||||||
@@ -51,7 +51,7 @@ public class CallableMethod(override val owner: Type, private val defaultImplOwn
|
|||||||
return signature.getAsmMethod()
|
return signature.getAsmMethod()
|
||||||
}
|
}
|
||||||
|
|
||||||
override val argumentTypes: Array<Type>
|
override val parameterTypes: Array<Type>
|
||||||
get() = getAsmMethod().getArgumentTypes()
|
get() = getAsmMethod().getArgumentTypes()
|
||||||
|
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ public class CallableMethod(override val owner: Type, private val defaultImplOwn
|
|||||||
val method = getAsmMethod();
|
val method = getAsmMethod();
|
||||||
val desc = JetTypeMapper.getDefaultDescriptor(method,
|
val desc = JetTypeMapper.getDefaultDescriptor(method,
|
||||||
if (invokeOpcode == INVOKESTATIC) null else defaultImplParam.getDescriptor(),
|
if (invokeOpcode == INVOKESTATIC) null else defaultImplParam.getDescriptor(),
|
||||||
receiverType != null);
|
extensionReceiverType != null);
|
||||||
|
|
||||||
if ("<init>".equals(method.getName())) {
|
if ("<init>".equals(method.getName())) {
|
||||||
v.aconst(null)
|
v.aconst(null)
|
||||||
|
|||||||
@@ -3595,7 +3595,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
|
|
||||||
Callable callable = resolveToCallable(operationDescriptor, false, isGetter ? resolvedGetCall : resolvedSetCall);
|
Callable callable = resolveToCallable(operationDescriptor, false, isGetter ? resolvedGetCall : resolvedSetCall);
|
||||||
Callable callableMethod = resolveToCallableMethod(operationDescriptor, false, context);
|
Callable callableMethod = resolveToCallableMethod(operationDescriptor, false, context);
|
||||||
Type[] argumentTypes = callableMethod.getArgumentTypes();
|
Type[] argumentTypes = callableMethod.getParameterTypes();
|
||||||
|
|
||||||
StackValue collectionElementReceiver =
|
StackValue collectionElementReceiver =
|
||||||
createCollectionElementReceiver(expression, receiver, array, arrayType, operationDescriptor, isGetter, resolvedGetCall, resolvedSetCall,
|
createCollectionElementReceiver(expression, receiver, array, arrayType, operationDescriptor, isGetter, resolvedGetCall, resolvedSetCall,
|
||||||
|
|||||||
@@ -954,7 +954,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Type argType : callableMethod.getArgumentTypes()) {
|
for (Type argType : callableMethod.getParameterTypes()) {
|
||||||
iv.load(reg, argType);
|
iv.load(reg, argType);
|
||||||
reg += argType.getSize();
|
reg += argType.getSize();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -952,7 +952,7 @@ public abstract class StackValue {
|
|||||||
throw new UnsupportedOperationException("no setter specified");
|
throw new UnsupportedOperationException("no setter specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
Type[] argumentTypes = setter.getArgumentTypes();
|
Type[] argumentTypes = setter.getParameterTypes();
|
||||||
coerce(topOfStackType, argumentTypes[argumentTypes.length - 1], v);
|
coerce(topOfStackType, argumentTypes[argumentTypes.length - 1], v);
|
||||||
setter.invokeWithNotNullAssertion(v, state, resolvedSetCall);
|
setter.invokeWithNotNullAssertion(v, state, resolvedSetCall);
|
||||||
Type returnType = setter.getReturnType();
|
Type returnType = setter.getReturnType();
|
||||||
@@ -1282,14 +1282,14 @@ public abstract class StackValue {
|
|||||||
ReceiverParameterDescriptor extensionReceiver = descriptor.getExtensionReceiverParameter();
|
ReceiverParameterDescriptor extensionReceiver = descriptor.getExtensionReceiverParameter();
|
||||||
|
|
||||||
if (extensionReceiver != null) {
|
if (extensionReceiver != null) {
|
||||||
return callableMethod != null ? callableMethod.getReceiverType() : typeMapper.mapType(extensionReceiver.getType());
|
return callableMethod != null ? callableMethod.getExtensionReceiverType() : typeMapper.mapType(extensionReceiver.getType());
|
||||||
}
|
}
|
||||||
else if (dispatchReceiver != null) {
|
else if (dispatchReceiver != null) {
|
||||||
if (AnnotationsPackage.isPlatformStaticInObjectOrClass(descriptor)) {
|
if (AnnotationsPackage.isPlatformStaticInObjectOrClass(descriptor)) {
|
||||||
return Type.VOID_TYPE;
|
return Type.VOID_TYPE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return callableMethod != null ? callableMethod.getThisType() : typeMapper.mapType(dispatchReceiver.getType());
|
return callableMethod != null ? callableMethod.getDispatchReceiverType() : typeMapper.mapType(dispatchReceiver.getType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (isLocalFunCall(callableMethod)) {
|
else if (isLocalFunCall(callableMethod)) {
|
||||||
|
|||||||
@@ -74,18 +74,18 @@ public class TailRecursionCodegen {
|
|||||||
throw new IllegalStateException("Failed to arrange value arguments by index: " + fd);
|
throw new IllegalStateException("Failed to arrange value arguments by index: " + fd);
|
||||||
}
|
}
|
||||||
assignParameterValues(fd, callable, arguments);
|
assignParameterValues(fd, callable, arguments);
|
||||||
if (callable.getReceiverType() != null) {
|
if (callable.getExtensionReceiverType() != null) {
|
||||||
if (resolvedCall.getExtensionReceiver() != fd.getExtensionReceiverParameter().getValue()) {
|
if (resolvedCall.getExtensionReceiver() != fd.getExtensionReceiverParameter().getValue()) {
|
||||||
StackValue expression = context.getReceiverExpression(codegen.typeMapper);
|
StackValue expression = context.getReceiverExpression(codegen.typeMapper);
|
||||||
expression.store(StackValue.onStack(callable.getReceiverType()), v, true);
|
expression.store(StackValue.onStack(callable.getExtensionReceiverType()), v, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AsmUtil.pop(v, callable.getReceiverType());
|
AsmUtil.pop(v, callable.getExtensionReceiverType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callable.getThisType() != null) {
|
if (callable.getDispatchReceiverType() != null) {
|
||||||
AsmUtil.pop(v, callable.getThisType());
|
AsmUtil.pop(v, callable.getDispatchReceiverType());
|
||||||
}
|
}
|
||||||
|
|
||||||
v.goTo(context.getMethodStartLabel());
|
v.goTo(context.getMethodStartLabel());
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|||||||
public class ArraySet : IntrinsicMethod() {
|
public class ArraySet : IntrinsicMethod() {
|
||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
val type = correctElementType(method.thisType)
|
val type = correctElementType(method.dispatchReceiverType)
|
||||||
return object: IntrinsicCallable(Type.VOID_TYPE, listOf(Type.INT_TYPE, type), method.thisType, method.receiverType) {
|
return object: IntrinsicCallable(Type.VOID_TYPE, listOf(Type.INT_TYPE, type), method.dispatchReceiverType, method.extensionReceiverType) {
|
||||||
override fun invokeIntrinsic(v: InstructionAdapter) {
|
override fun invokeIntrinsic(v: InstructionAdapter) {
|
||||||
v.astore(type)
|
v.astore(type)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class CompareTo : IntrinsicMethod() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
val parameterType = comparisonOperandType(method.thisType ?: method.receiverType, method.argumentTypes.single())
|
val parameterType = comparisonOperandType(method.dispatchReceiverType ?: method.extensionReceiverType, method.parameterTypes.single())
|
||||||
return createBinaryIntrinsicCallable(method.returnType, parameterType, parameterType, null) {
|
return createBinaryIntrinsicCallable(method.returnType, parameterType, parameterType, null) {
|
||||||
genInvoke(parameterType, it)
|
genInvoke(parameterType, it)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
|
|||||||
public class Equals : IntrinsicMethod() {
|
public class Equals : IntrinsicMethod() {
|
||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
return createBinaryIntrinsicCallable(method.returnType, OBJECT_TYPE, nullOrObject(method.thisType), nullOrObject(method.receiverType)) {
|
return createBinaryIntrinsicCallable(method.returnType, OBJECT_TYPE, nullOrObject(method.dispatchReceiverType), nullOrObject(method.extensionReceiverType)) {
|
||||||
AsmUtil.genAreEqualCall(it)
|
AsmUtil.genAreEqualCall(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|||||||
public class HashCode : IntrinsicMethod() {
|
public class HashCode : IntrinsicMethod() {
|
||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
return object: IntrinsicCallable(Type.INT_TYPE, emptyList(), nullOrObject(method.thisType), nullOrObject(method.receiverType)) {
|
return object: IntrinsicCallable(Type.INT_TYPE, emptyList(), nullOrObject(method.dispatchReceiverType), nullOrObject(method.extensionReceiverType)) {
|
||||||
override fun invokeIntrinsic(v: InstructionAdapter) {
|
override fun invokeIntrinsic(v: InstructionAdapter) {
|
||||||
v.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false)
|
v.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|||||||
|
|
||||||
public abstract class IntrinsicCallable(override val returnType: Type,
|
public abstract class IntrinsicCallable(override val returnType: Type,
|
||||||
override val valueParameterTypes: List<Type>,
|
override val valueParameterTypes: List<Type>,
|
||||||
override val thisType: Type?,
|
override val dispatchReceiverType: Type?,
|
||||||
override val receiverType: Type?) : Callable {
|
override val extensionReceiverType: Type?) : Callable {
|
||||||
|
|
||||||
override fun invokeWithoutAssertions(v: InstructionAdapter) {
|
override fun invokeWithoutAssertions(v: InstructionAdapter) {
|
||||||
invokeIntrinsic(v)
|
invokeIntrinsic(v)
|
||||||
@@ -40,7 +40,7 @@ public abstract class IntrinsicCallable(override val returnType: Type,
|
|||||||
|
|
||||||
public abstract fun invokeIntrinsic(v: InstructionAdapter);
|
public abstract fun invokeIntrinsic(v: InstructionAdapter);
|
||||||
|
|
||||||
override val argumentTypes: Array<Type>
|
override val parameterTypes: Array<Type>
|
||||||
get() {
|
get() {
|
||||||
throw UnsupportedOperationException()
|
throw UnsupportedOperationException()
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ public abstract class IntrinsicCallable(override val returnType: Type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public fun calcReceiverType(): Type? {
|
public fun calcReceiverType(): Type? {
|
||||||
return receiverType ?: thisType
|
return extensionReceiverType ?: dispatchReceiverType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ public class UnaryIntrinsic(
|
|||||||
needPrimitiveCheck: Boolean = true,
|
needPrimitiveCheck: Boolean = true,
|
||||||
newThisType: Type? = null,
|
newThisType: Type? = null,
|
||||||
private val invoke: UnaryIntrinsic.(v: InstructionAdapter) -> Unit
|
private val invoke: UnaryIntrinsic.(v: InstructionAdapter) -> Unit
|
||||||
) : IntrinsicCallable(newReturnType ?: callable.returnType, callable.valueParameterTypes, newThisType ?: callable.thisType, callable.receiverType) {
|
) : IntrinsicCallable(newReturnType ?: callable.returnType, callable.valueParameterTypes, newThisType ?: callable.dispatchReceiverType, callable.extensionReceiverType) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (needPrimitiveCheck) {
|
if (needPrimitiveCheck) {
|
||||||
@@ -105,7 +105,7 @@ public fun createUnaryIntrinsicCallable(
|
|||||||
}
|
}
|
||||||
|
|
||||||
public open class MappedCallable(val callable: CallableMethod, val invoke: IntrinsicCallable.(v: InstructionAdapter) -> Unit = {}) :
|
public open class MappedCallable(val callable: CallableMethod, val invoke: IntrinsicCallable.(v: InstructionAdapter) -> Unit = {}) :
|
||||||
IntrinsicCallable(callable.returnType, callable.valueParameterTypes, callable.thisType, callable.receiverType) {
|
IntrinsicCallable(callable.returnType, callable.valueParameterTypes, callable.dispatchReceiverType, callable.extensionReceiverType) {
|
||||||
|
|
||||||
override fun invokeIntrinsic(v: InstructionAdapter) {
|
override fun invokeIntrinsic(v: InstructionAdapter) {
|
||||||
invoke(v)
|
invoke(v)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class RangeTo : IntrinsicMethod() {
|
|||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
val argType = nameToPrimitive(method.returnType.getInternalName().substringAfter("kotlin/").substringBefore("Range"))
|
val argType = nameToPrimitive(method.returnType.getInternalName().substringAfter("kotlin/").substringBefore("Range"))
|
||||||
return object : IntrinsicCallable(method.returnType, method.valueParameterTypes.map { argType }, nullOr(method.thisType, argType), nullOr(method.receiverType, argType)) {
|
return object : IntrinsicCallable(method.returnType, method.valueParameterTypes.map { argType }, nullOr(method.dispatchReceiverType, argType), nullOr(method.extensionReceiverType, argType)) {
|
||||||
override fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) {
|
override fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) {
|
||||||
v.anew(returnType)
|
v.anew(returnType)
|
||||||
v.dup()
|
v.dup()
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.codegen.CallableMethod
|
|||||||
public class ToString : IntrinsicMethod() {
|
public class ToString : IntrinsicMethod() {
|
||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
val type = AsmUtil.stringValueOfType(method.thisType ?: method.receiverType)
|
val type = AsmUtil.stringValueOfType(method.dispatchReceiverType ?: method.extensionReceiverType)
|
||||||
return createUnaryIntrinsicCallable(method, newThisType = type) {
|
return createUnaryIntrinsicCallable(method, newThisType = type) {
|
||||||
it.invokestatic("java/lang/String", "valueOf", "(" + type.getDescriptor() + ")Ljava/lang/String;", false)
|
it.invokestatic("java/lang/String", "valueOf", "(" + type.getDescriptor() + ")Ljava/lang/String;", false)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user