Add KotlinType to the Coercion stack value
This commit is contained in:
@@ -269,7 +269,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
@NotNull ClassDescriptor required
|
@NotNull ClassDescriptor required
|
||||||
) {
|
) {
|
||||||
if (!isJvmInterface(provided) && isJvmInterface(required)) {
|
if (!isJvmInterface(provided) && isJvmInterface(required)) {
|
||||||
return StackValue.coercion(inner, asmType(required.getDefaultType()));
|
SimpleType requiredDefaultType = required.getDefaultType();
|
||||||
|
return StackValue.coercion(inner, asmType(requiredDefaultType), requiredDefaultType);
|
||||||
}
|
}
|
||||||
|
|
||||||
return inner;
|
return inner;
|
||||||
@@ -359,7 +360,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
public StackValue genLazy(KtElement expr, Type type) {
|
public StackValue genLazy(KtElement expr, Type type) {
|
||||||
StackValue value = gen(expr);
|
StackValue value = gen(expr);
|
||||||
return StackValue.coercion(value, type);
|
return StackValue.coercion(value, type, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private StackValue genStatement(KtElement statement) {
|
private StackValue genStatement(KtElement statement) {
|
||||||
@@ -463,6 +464,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
/* package */ StackValue generateIfExpression(@NotNull KtIfExpression expression, boolean isStatement) {
|
/* package */ StackValue generateIfExpression(@NotNull KtIfExpression expression, boolean isStatement) {
|
||||||
Type asmType = isStatement ? Type.VOID_TYPE : expressionType(expression);
|
Type asmType = isStatement ? Type.VOID_TYPE : expressionType(expression);
|
||||||
|
KotlinType kotlinType = isStatement ? null : kotlinType(expression);
|
||||||
StackValue condition = gen(expression.getCondition());
|
StackValue condition = gen(expression.getCondition());
|
||||||
|
|
||||||
KtExpression thenExpression = expression.getThen();
|
KtExpression thenExpression = expression.getThen();
|
||||||
@@ -470,7 +472,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
if (isEmptyExpression(thenExpression)) {
|
if (isEmptyExpression(thenExpression)) {
|
||||||
if (isEmptyExpression(elseExpression)) {
|
if (isEmptyExpression(elseExpression)) {
|
||||||
return StackValue.coercion(condition, asmType);
|
return StackValue.coercion(condition, asmType, kotlinType);
|
||||||
}
|
}
|
||||||
return generateSingleBranchIf(condition, expression, elseExpression, false, isStatement);
|
return generateSingleBranchIf(condition, expression, elseExpression, false, isStatement);
|
||||||
}
|
}
|
||||||
@@ -2861,7 +2863,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
ReceiverValue receiver = getBoundCallableReferenceReceiver(resolvedCall);
|
ReceiverValue receiver = getBoundCallableReferenceReceiver(resolvedCall);
|
||||||
if (receiver == null) return null;
|
if (receiver == null) return null;
|
||||||
|
|
||||||
return StackValue.coercion(generateReceiverValue(receiver, false), asmType(receiver.getType()));
|
KotlinType receiverType = receiver.getType();
|
||||||
|
return StackValue.coercion(generateReceiverValue(receiver, false), asmType(receiverType), receiverType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -2930,9 +2933,10 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
expression = deparenthesized;
|
expression = deparenthesized;
|
||||||
Type type = expressionType(expression);
|
Type type = expressionType(expression);
|
||||||
|
KotlinType kotlinType = kotlinType(expression);
|
||||||
|
|
||||||
if (expression instanceof KtSafeQualifiedExpression && !isPrimitive(type)) {
|
if (expression instanceof KtSafeQualifiedExpression && !isPrimitive(type)) {
|
||||||
return StackValue.coercion(generateSafeQualifiedExpression((KtSafeQualifiedExpression) expression, ifnull), type);
|
return StackValue.coercion(generateSafeQualifiedExpression((KtSafeQualifiedExpression) expression, ifnull), type, kotlinType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return genLazy(expression, type);
|
return genLazy(expression, type);
|
||||||
@@ -2958,9 +2962,10 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
public StackValue visitSafeQualifiedExpression(@NotNull KtSafeQualifiedExpression expression, StackValue unused) {
|
public StackValue visitSafeQualifiedExpression(@NotNull KtSafeQualifiedExpression expression, StackValue unused) {
|
||||||
Label ifnull = new Label();
|
Label ifnull = new Label();
|
||||||
Type type = boxType(expressionType(expression));
|
Type type = boxType(expressionType(expression));
|
||||||
|
KotlinType kotlinType = kotlinType(expression);
|
||||||
|
|
||||||
StackValue value = generateSafeQualifiedExpression(expression, ifnull);
|
StackValue value = generateSafeQualifiedExpression(expression, ifnull);
|
||||||
StackValue newReceiver = StackValue.coercion(value, type);
|
StackValue newReceiver = StackValue.coercion(value, type, kotlinType);
|
||||||
StackValue result;
|
StackValue result;
|
||||||
|
|
||||||
if (!isPrimitive(expressionType(expression.getReceiverExpression()))) {
|
if (!isPrimitive(expressionType(expression.getReceiverExpression()))) {
|
||||||
@@ -3039,7 +3044,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
}
|
}
|
||||||
|
|
||||||
private StackValue genLazyUnlessProvided(@Nullable StackValue pregenerated, @NotNull KtExpression expr, @NotNull Type type) {
|
private StackValue genLazyUnlessProvided(@Nullable StackValue pregenerated, @NotNull KtExpression expr, @NotNull Type type) {
|
||||||
return pregenerated != null ? StackValue.coercion(pregenerated, type) : genLazy(expr, type);
|
return pregenerated != null ? StackValue.coercion(pregenerated, type, null) : genLazy(expr, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private StackValue genUnlessProvided(@Nullable StackValue pregenerated, @NotNull KtExpression expr, @NotNull Type type) {
|
private StackValue genUnlessProvided(@Nullable StackValue pregenerated, @NotNull KtExpression expr, @NotNull Type type) {
|
||||||
@@ -3309,7 +3314,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
leftValue.dup(v, false);
|
leftValue.dup(v, false);
|
||||||
Label leftIsNull = new Label();
|
Label leftIsNull = new Label();
|
||||||
v.ifnull(leftIsNull);
|
v.ifnull(leftIsNull);
|
||||||
StackValue.coercion(leftValue, leftType).put(leftType, null, v);
|
StackValue.coercion(leftValue, leftType, null).put(leftType, null, v);
|
||||||
StackValue nonNullLeftValue = StackValue.onStack(leftType);
|
StackValue nonNullLeftValue = StackValue.onStack(leftType);
|
||||||
|
|
||||||
StackValue rightValue = gen(right);
|
StackValue rightValue = gen(right);
|
||||||
@@ -3326,7 +3331,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
v.mark(rightIsNotNull);
|
v.mark(rightIsNotNull);
|
||||||
}
|
}
|
||||||
|
|
||||||
StackValue.coercion(rightValue, rightType).put(rightType, null, v);
|
StackValue.coercion(rightValue, rightType, null).put(rightType, null, v);
|
||||||
StackValue nonNullRightValue = StackValue.onStack(rightType);
|
StackValue nonNullRightValue = StackValue.onStack(rightType);
|
||||||
StackValue.cmp(opToken, leftType, nonNullLeftValue, nonNullRightValue).put(Type.BOOLEAN_TYPE, null, v);
|
StackValue.cmp(opToken, leftType, nonNullLeftValue, nonNullRightValue).put(Type.BOOLEAN_TYPE, null, v);
|
||||||
v.goTo(end);
|
v.goTo(end);
|
||||||
@@ -3356,7 +3361,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
StackValue.coercion(leftValue, leftType).put(leftType, null, v);
|
StackValue.coercion(leftValue, leftType, null).put(leftType, null, v);
|
||||||
leftValue = StackValue.onStack(leftType);
|
leftValue = StackValue.onStack(leftType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3374,7 +3379,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
v.goTo(end);
|
v.goTo(end);
|
||||||
|
|
||||||
v.mark(rightIsNotNull);
|
v.mark(rightIsNotNull);
|
||||||
StackValue.coercion(rightValue, rightType).put(rightType, null, v);
|
StackValue.coercion(rightValue, rightType, null).put(rightType, null, v);
|
||||||
StackValue nonNullRightValue = StackValue.onStack(rightType);
|
StackValue nonNullRightValue = StackValue.onStack(rightType);
|
||||||
StackValue.cmp(opToken, leftType, leftValue, nonNullRightValue).put(Type.BOOLEAN_TYPE, null, v);
|
StackValue.cmp(opToken, leftType, leftValue, nonNullRightValue).put(Type.BOOLEAN_TYPE, null, v);
|
||||||
|
|
||||||
|
|||||||
@@ -566,11 +566,11 @@ public abstract class StackValue {
|
|||||||
return new FieldForSharedVar(field.type, field.owner, field.name, newSharedVarReceiver, field.isLateinit, field.variableName);
|
return new FieldForSharedVar(field.type, field.owner, field.name, newSharedVarReceiver, field.isLateinit, field.variableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static StackValue coercion(@NotNull StackValue value, @NotNull Type castType) {
|
public static StackValue coercion(@NotNull StackValue value, @NotNull Type castType, @Nullable KotlinType castKotlinType) {
|
||||||
if (value.type.equals(castType)) {
|
if (value.type.equals(castType)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
return new CoercionValue(value, castType);
|
return new CoercionValue(value, castType, castKotlinType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -683,7 +683,7 @@ public abstract class StackValue {
|
|||||||
private static StackValue platformStaticCallIfPresent(@NotNull StackValue resultReceiver, @NotNull CallableDescriptor descriptor) {
|
private static StackValue platformStaticCallIfPresent(@NotNull StackValue resultReceiver, @NotNull CallableDescriptor descriptor) {
|
||||||
if (CodegenUtilKt.isJvmStaticInObjectOrClassOrInterface(descriptor)) {
|
if (CodegenUtilKt.isJvmStaticInObjectOrClassOrInterface(descriptor)) {
|
||||||
if (resultReceiver.canHaveSideEffects()) {
|
if (resultReceiver.canHaveSideEffects()) {
|
||||||
return coercion(resultReceiver, Type.VOID_TYPE);
|
return coercion(resultReceiver, Type.VOID_TYPE, null);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return none();
|
return none();
|
||||||
|
|||||||
@@ -22,13 +22,14 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|||||||
|
|
||||||
class CoercionValue(
|
class CoercionValue(
|
||||||
val value: StackValue,
|
val value: StackValue,
|
||||||
private val castType: Type
|
private val castType: Type,
|
||||||
|
private val castKotlinType: KotlinType?
|
||||||
) : StackValue(castType, value.canHaveSideEffects()) {
|
) : StackValue(castType, value.canHaveSideEffects()) {
|
||||||
|
|
||||||
override fun putSelector(type: Type, kotlinType: KotlinType?, v: InstructionAdapter) {
|
override fun putSelector(type: Type, kotlinType: KotlinType?, v: InstructionAdapter) {
|
||||||
value.putSelector(value.type, value.kotlinType, v)
|
value.putSelector(value.type, value.kotlinType, v)
|
||||||
StackValue.coerce(value.type, castType, v)
|
StackValue.coerce(value.type, value.kotlinType, castType, castKotlinType, v)
|
||||||
StackValue.coerce(castType, type, v)
|
StackValue.coerce(castType, castKotlinType, type, kotlinType, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun storeSelector(topOfStackType: Type, topOfStackKotlinType: KotlinType?, v: InstructionAdapter) {
|
override fun storeSelector(topOfStackType: Type, topOfStackKotlinType: KotlinType?, v: InstructionAdapter) {
|
||||||
@@ -110,7 +111,7 @@ fun ValueParameterDescriptor.findJavaDefaultArgumentValue(targetType: Type, type
|
|||||||
is EnumEntry -> enumEntry(castResult.descriptor, typeMapper)
|
is EnumEntry -> enumEntry(castResult.descriptor, typeMapper)
|
||||||
is Constant -> {
|
is Constant -> {
|
||||||
val unboxedType = unboxPrimitiveTypeOrNull(targetType) ?: targetType
|
val unboxedType = unboxPrimitiveTypeOrNull(targetType) ?: targetType
|
||||||
return coercion(constant(castResult.value, unboxedType), targetType)
|
return coercion(constant(castResult.value, unboxedType), targetType, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -728,7 +728,10 @@ class PsiInlineCodegen(
|
|||||||
val receiverValue = getBoundCallableReferenceReceiver(argumentExpression)
|
val receiverValue = getBoundCallableReferenceReceiver(argumentExpression)
|
||||||
if (receiverValue != null) {
|
if (receiverValue != null) {
|
||||||
val receiver = codegen.generateReceiverValue(receiverValue, false)
|
val receiver = codegen.generateReceiverValue(receiverValue, false)
|
||||||
putClosureParametersOnStack(lambdaInfo, StackValue.coercion(receiver, receiver.type.boxReceiverForBoundReference()))
|
putClosureParametersOnStack(
|
||||||
|
lambdaInfo,
|
||||||
|
StackValue.coercion(receiver, receiver.type.boxReceiverForBoundReference(), null)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
+4
-14
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
*
|
* that can be found in the license/LICENSE.txt file.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.intrinsics
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
@@ -40,7 +29,8 @@ class KCallableNameProperty : IntrinsicPropertyGetter() {
|
|||||||
// Generate the left-hand side of a bound callable reference expression
|
// Generate the left-hand side of a bound callable reference expression
|
||||||
if (callableReferenceReceiver != null && callableReferenceReceiver !is ImplicitClassReceiver) {
|
if (callableReferenceReceiver != null && callableReferenceReceiver !is ImplicitClassReceiver) {
|
||||||
val stackValue = codegen.generateReceiverValue(callableReferenceReceiver, false)
|
val stackValue = codegen.generateReceiverValue(callableReferenceReceiver, false)
|
||||||
StackValue.coercion(stackValue, codegen.asmType(callableReferenceReceiver.type)).put(VOID_TYPE, iv)
|
val kotlinType = callableReferenceReceiver.type
|
||||||
|
StackValue.coercion(stackValue, codegen.asmType(kotlinType), kotlinType).put(VOID_TYPE, iv)
|
||||||
}
|
}
|
||||||
|
|
||||||
iv.aconst(referenceResolvedCall.resultingDescriptor.name.asString())
|
iv.aconst(referenceResolvedCall.resultingDescriptor.name.asString())
|
||||||
|
|||||||
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
*
|
* that can be found in the license/LICENSE.txt file.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.intrinsics
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
@@ -31,6 +20,6 @@ class KClassJavaProperty : IntrinsicPropertyGetter() {
|
|||||||
val receiverExpression = classLiteralExpression.receiverExpression ?: return null
|
val receiverExpression = classLiteralExpression.receiverExpression ?: return null
|
||||||
val lhs = codegen.bindingContext.get(DOUBLE_COLON_LHS, receiverExpression) ?: return null
|
val lhs = codegen.bindingContext.get(DOUBLE_COLON_LHS, receiverExpression) ?: return null
|
||||||
val value = codegen.generateClassLiteralReference(lhs, receiverExpression, /* wrapIntoKClass = */ false)
|
val value = codegen.generateClassLiteralReference(lhs, receiverExpression, /* wrapIntoKClass = */ false)
|
||||||
return StackValue.coercion(value, returnType)
|
return StackValue.coercion(value, returnType, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user