Make intrinsic method always generate value of expected type on stack
IntrinsicMethod.generate()'s return value is 'StackValue.onStack(returnType)' and will be dropped
This commit is contained in:
@@ -1621,13 +1621,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
descriptor = descriptor.getOriginal();
|
||||
|
||||
if (descriptor instanceof CallableMemberDescriptor) {
|
||||
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
|
||||
memberDescriptor = unwrapFakeOverride(memberDescriptor);
|
||||
CallableMemberDescriptor memberDescriptor = unwrapFakeOverride((CallableMemberDescriptor) descriptor);
|
||||
|
||||
IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor);
|
||||
if (intrinsic != null) {
|
||||
Type returnType = typeMapper.mapType(memberDescriptor);
|
||||
return intrinsic.generate(this, v, returnType, expression, Collections.<JetExpression>emptyList(), receiver, state);
|
||||
intrinsic.generate(this, v, returnType, expression, Collections.<JetExpression>emptyList(), receiver, state);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2010,8 +2010,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
|
||||
Type returnType = typeMapper.mapType(resolvedCall.getResultingDescriptor());
|
||||
|
||||
StackValue stackValue = intrinsic.generate(this, v, returnType, call.getCallElement(), args, receiver, state);
|
||||
stackValue.put(returnType, v);
|
||||
intrinsic.generate(this, v, returnType, call.getCallElement(), args, receiver, state);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
@@ -2650,8 +2649,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
if (callable instanceof IntrinsicMethod) {
|
||||
//noinspection ConstantConditions
|
||||
Type returnType = typeMapper.mapType(resolvedCall.getResultingDescriptor());
|
||||
return ((IntrinsicMethod) callable).generate(this, v, returnType, expression,
|
||||
Arrays.asList(expression.getLeft(), expression.getRight()), receiver, state);
|
||||
((IntrinsicMethod) callable).generate(this, v, returnType, expression,
|
||||
Arrays.asList(expression.getLeft(), expression.getRight()), receiver, state);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
else {
|
||||
return invokeFunction(call, receiver, resolvedCall);
|
||||
@@ -2983,35 +2983,34 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
Callable callable = resolveToCallable((FunctionDescriptor) op, false);
|
||||
if (callable instanceof IntrinsicMethod) {
|
||||
Type returnType = typeMapper.mapType((FunctionDescriptor) op);
|
||||
return ((IntrinsicMethod) callable).generate(this, v, returnType, expression,
|
||||
Collections.singletonList(expression.getBaseExpression()), receiver, state);
|
||||
((IntrinsicMethod) callable).generate(this, v, returnType, expression,
|
||||
Collections.singletonList(expression.getBaseExpression()), receiver, state);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
else {
|
||||
DeclarationDescriptor cls = op.getContainingDeclaration();
|
||||
ResolvedCall<? extends CallableDescriptor> resolvedCall =
|
||||
bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
|
||||
assert resolvedCall != null;
|
||||
|
||||
if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) {
|
||||
Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference());
|
||||
return invokeFunction(call, receiver, resolvedCall);
|
||||
}
|
||||
else {
|
||||
CallableMethod callableMethod = (CallableMethod) callable;
|
||||
DeclarationDescriptor cls = op.getContainingDeclaration();
|
||||
ResolvedCall<? extends CallableDescriptor> resolvedCall =
|
||||
bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
|
||||
assert resolvedCall != null;
|
||||
|
||||
StackValue value = gen(expression.getBaseExpression());
|
||||
value.dupReceiver(v);
|
||||
value.dupReceiver(v);
|
||||
|
||||
Type type = expressionType(expression.getBaseExpression());
|
||||
value.put(type, v);
|
||||
callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall);
|
||||
|
||||
value.store(callableMethod.getReturnType(), v);
|
||||
value.put(type, v);
|
||||
return StackValue.onStack(type);
|
||||
}
|
||||
if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) {
|
||||
Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference());
|
||||
return invokeFunction(call, receiver, resolvedCall);
|
||||
}
|
||||
|
||||
CallableMethod callableMethod = (CallableMethod) callable;
|
||||
|
||||
StackValue value = gen(expression.getBaseExpression());
|
||||
value.dupReceiver(v);
|
||||
value.dupReceiver(v);
|
||||
|
||||
Type type = expressionType(expression.getBaseExpression());
|
||||
value.put(type, v);
|
||||
callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall);
|
||||
|
||||
value.store(callableMethod.getReturnType(), v);
|
||||
value.put(type, v);
|
||||
return StackValue.onStack(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -632,7 +632,7 @@ public abstract class StackValue {
|
||||
((CallableMethod) getter).invokeWithNotNullAssertion(v, state, resolvedGetCall);
|
||||
}
|
||||
else {
|
||||
((IntrinsicMethod) getter).generate(codegen, v, type, null, null, null, state);
|
||||
((IntrinsicMethod) getter).generate(codegen, v, this.type, null, null, null, state);
|
||||
}
|
||||
coerceTo(type, v);
|
||||
}
|
||||
|
||||
@@ -48,6 +48,8 @@ public class ArrayGet implements IntrinsicMethod {
|
||||
|
||||
v.aload(type);
|
||||
|
||||
return StackValue.onStack(type);
|
||||
StackValue.coerce(type, returnType, v);
|
||||
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.asm4.Type;
|
||||
import org.jetbrains.asm4.commons.InstructionAdapter;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
import org.jetbrains.jet.codegen.StackValue;
|
||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||
@@ -28,6 +27,8 @@ import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JET_INT_RANGE_TYPE;
|
||||
|
||||
public class ArrayIndices implements IntrinsicMethod {
|
||||
@Override
|
||||
public StackValue generate(
|
||||
@@ -42,6 +43,7 @@ public class ArrayIndices implements IntrinsicMethod {
|
||||
receiver.put(receiver.type, v);
|
||||
v.arraylength();
|
||||
v.invokestatic("jet/runtime/Ranges", "arrayIndices", "(I)Ljet/IntRange;");
|
||||
return StackValue.onStack(AsmTypeConstants.JET_INT_RANGE_TYPE);
|
||||
StackValue.coerce(JET_INT_RANGE_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.psi.JetCallExpression;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||
@@ -38,6 +37,7 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType;
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JET_ITERATOR_TYPE;
|
||||
import static org.jetbrains.jet.lang.resolve.java.mapping.PrimitiveTypesUtil.asmTypeForPrimitive;
|
||||
|
||||
public class ArrayIterator implements IntrinsicMethod {
|
||||
@@ -59,7 +59,8 @@ public class ArrayIterator implements IntrinsicMethod {
|
||||
ClassDescriptor containingDeclaration = (ClassDescriptor) funDescriptor.getContainingDeclaration().getOriginal();
|
||||
if (containingDeclaration.equals(KotlinBuiltIns.getInstance().getArray())) {
|
||||
v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;)Ljava/util/Iterator;");
|
||||
return StackValue.onStack(AsmTypeConstants.JET_ITERATOR_TYPE);
|
||||
StackValue.coerce(JET_ITERATOR_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
|
||||
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
|
||||
@@ -69,7 +70,8 @@ public class ArrayIterator implements IntrinsicMethod {
|
||||
String iteratorDesc = asmDescByFqNameWithoutInnerClasses(new FqName("jet." + primitiveType.getTypeName() + "Iterator"));
|
||||
String methodSignature = "([" + asmTypeForPrimitive(jvmPrimitiveType) + ")" + iteratorDesc;
|
||||
v.invokestatic("jet/runtime/ArrayIterator", "iterator", methodSignature);
|
||||
return StackValue.onStack(Type.getType(iteratorDesc));
|
||||
StackValue.coerce(Type.getType(iteratorDesc), returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
import org.jetbrains.jet.codegen.StackValue;
|
||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -49,6 +48,8 @@ public class ArraySet implements IntrinsicMethod {
|
||||
|
||||
v.astore(type);
|
||||
|
||||
return StackValue.none();
|
||||
StackValue.coerce(Type.VOID_TYPE, returnType, v);
|
||||
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ public class ArraySize implements IntrinsicMethod {
|
||||
receiver.put(receiver.type, v);
|
||||
v.arraylength();
|
||||
|
||||
return StackValue.onStack(Type.INT_TYPE);
|
||||
StackValue.coerce(Type.INT_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,6 +76,8 @@ public class CompareTo implements IntrinsicMethod {
|
||||
else {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
return StackValue.onStack(Type.INT_TYPE);
|
||||
|
||||
StackValue.coerce(Type.INT_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,8 @@ public class Equals implements IntrinsicMethod {
|
||||
leftExpr.put(AsmTypeConstants.OBJECT_TYPE, v);
|
||||
codegen.gen(rightExpr).put(AsmTypeConstants.OBJECT_TYPE, v);
|
||||
|
||||
return genEqualsForExpressionsOnStack(v, JetTokens.EQEQ, AsmTypeConstants.OBJECT_TYPE, AsmTypeConstants.OBJECT_TYPE);
|
||||
StackValue value = genEqualsForExpressionsOnStack(v, JetTokens.EQEQ, AsmTypeConstants.OBJECT_TYPE, AsmTypeConstants.OBJECT_TYPE);
|
||||
value.put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,11 +22,11 @@ import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.asm4.Opcodes;
|
||||
import org.jetbrains.asm4.Type;
|
||||
import org.jetbrains.asm4.commons.InstructionAdapter;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
import org.jetbrains.jet.codegen.StackValue;
|
||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -43,6 +43,7 @@ public class HashCode implements IntrinsicMethod {
|
||||
) {
|
||||
receiver.put(AsmTypeConstants.OBJECT_TYPE, v);
|
||||
v.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I");
|
||||
return StackValue.onStack(Type.INT_TYPE);
|
||||
StackValue.coerce(Type.INT_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ public class IdentityEquals implements IntrinsicMethod {
|
||||
codegen.gen(e.getLeft()).put(OBJECT_TYPE, v);
|
||||
codegen.gen(e.getRight()).put(OBJECT_TYPE, v);
|
||||
}
|
||||
return StackValue.cmp(JetTokens.EQEQEQ, OBJECT_TYPE);
|
||||
StackValue.cmp(JetTokens.EQEQEQ, OBJECT_TYPE).put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,8 @@ public class Increment implements IntrinsicMethod {
|
||||
if (operand instanceof JetReferenceExpression && returnType == Type.INT_TYPE) {
|
||||
int index = codegen.indexOfLocal((JetReferenceExpression) operand);
|
||||
if (index >= 0) {
|
||||
return StackValue.preIncrement(index, myDelta);
|
||||
StackValue.preIncrement(index, myDelta).put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
StackValue value = codegen.genQualified(receiver, operand);
|
||||
|
||||
@@ -39,6 +39,7 @@ public class IteratorIterator implements IntrinsicMethod {
|
||||
StackValue receiver,
|
||||
@NotNull GenerationState state
|
||||
) {
|
||||
return receiver;
|
||||
receiver.put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,13 +29,13 @@ import org.jetbrains.jet.lang.psi.JetCallExpression;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType;
|
||||
|
||||
public class JavaClassFunction implements IntrinsicMethod {
|
||||
@Override
|
||||
@@ -57,6 +57,8 @@ public class JavaClassFunction implements IntrinsicMethod {
|
||||
else {
|
||||
v.aconst(type);
|
||||
}
|
||||
return StackValue.onStack(AsmTypeConstants.getType(Class.class));
|
||||
|
||||
StackValue.coerce(getType(Class.class), expectedType, v);
|
||||
return StackValue.onStack(expectedType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,12 +25,12 @@ import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
import org.jetbrains.jet.codegen.StackValue;
|
||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType;
|
||||
|
||||
public class JavaClassProperty implements IntrinsicMethod {
|
||||
@Override
|
||||
@@ -51,6 +51,8 @@ public class JavaClassProperty implements IntrinsicMethod {
|
||||
receiver.put(type, v);
|
||||
v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;");
|
||||
}
|
||||
return StackValue.onStack(AsmTypeConstants.getType(Class.class));
|
||||
|
||||
StackValue.coerce(getType(Class.class), returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class Not implements IntrinsicMethod {
|
||||
stackValue = receiver;
|
||||
}
|
||||
stackValue.put(Type.BOOLEAN_TYPE, v);
|
||||
return StackValue.not(StackValue.onStack(Type.BOOLEAN_TYPE));
|
||||
StackValue.not(StackValue.onStack(Type.BOOLEAN_TYPE)).put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,10 +29,6 @@ import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import java.util.List;
|
||||
|
||||
public class RangeTo implements IntrinsicMethod {
|
||||
|
||||
public RangeTo() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackValue generate(
|
||||
ExpressionCodegen codegen,
|
||||
@@ -50,22 +46,17 @@ public class RangeTo implements IntrinsicMethod {
|
||||
codegen.gen(arguments.get(0), rightType);
|
||||
v.invokestatic("jet/runtime/Ranges", "rangeTo",
|
||||
"(" + receiver.type.getDescriptor() + leftType.getDescriptor() + ")" + returnType.getDescriptor());
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
else {
|
||||
JetBinaryExpression expression = (JetBinaryExpression) element;
|
||||
Type leftType = codegen.expressionType(expression.getLeft());
|
||||
Type rightType = codegen.expressionType(expression.getRight());
|
||||
// if (JetTypeMapper.isIntPrimitive(leftType)) {
|
||||
codegen.gen(expression.getLeft(), leftType);
|
||||
codegen.gen(expression.getRight(), rightType);
|
||||
v.invokestatic("jet/runtime/Ranges", "rangeTo",
|
||||
"(" + leftType.getDescriptor() + rightType.getDescriptor() + ")" + returnType.getDescriptor());
|
||||
return StackValue.onStack(returnType);
|
||||
// }
|
||||
// else {
|
||||
// throw new UnsupportedOperationException("ranges are only supported for int objects");
|
||||
// }
|
||||
}
|
||||
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class StringGetChar implements IntrinsicMethod {
|
||||
codegen.gen(arguments.get(0)).put(Type.INT_TYPE, v);
|
||||
}
|
||||
v.invokeinterface("java/lang/CharSequence", "charAt", "(I)C");
|
||||
return StackValue.onStack(Type.CHAR_TYPE);
|
||||
StackValue.coerce(Type.CHAR_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ public class StringLength implements IntrinsicMethod {
|
||||
) {
|
||||
receiver.put(receiver.type, v);
|
||||
v.invokeinterface("java/lang/CharSequence", "length", "()I");
|
||||
return StackValue.onStack(Type.INT_TYPE);
|
||||
StackValue.coerce(Type.INT_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.asm4.Type;
|
||||
import org.jetbrains.asm4.commons.InstructionAdapter;
|
||||
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
import org.jetbrains.jet.codegen.StackValue;
|
||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||
@@ -28,6 +27,9 @@ import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE;
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
|
||||
|
||||
public class StringPlus implements IntrinsicMethod {
|
||||
@Override
|
||||
public StackValue generate(
|
||||
@@ -40,14 +42,16 @@ public class StringPlus implements IntrinsicMethod {
|
||||
@NotNull GenerationState state
|
||||
) {
|
||||
if (receiver == null || receiver == StackValue.none()) {
|
||||
codegen.gen(arguments.get(0)).put(AsmTypeConstants.JAVA_STRING_TYPE, v);
|
||||
codegen.gen(arguments.get(1)).put(AsmTypeConstants.OBJECT_TYPE, v);
|
||||
codegen.gen(arguments.get(0)).put(JAVA_STRING_TYPE, v);
|
||||
codegen.gen(arguments.get(1)).put(OBJECT_TYPE, v);
|
||||
}
|
||||
else {
|
||||
receiver.put(AsmTypeConstants.JAVA_STRING_TYPE, v);
|
||||
codegen.gen(arguments.get(0)).put(AsmTypeConstants.OBJECT_TYPE, v);
|
||||
receiver.put(JAVA_STRING_TYPE, v);
|
||||
codegen.gen(arguments.get(0)).put(OBJECT_TYPE, v);
|
||||
}
|
||||
v.invokestatic("jet/runtime/Intrinsics", "stringPlus", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;");
|
||||
return StackValue.onStack(AsmTypeConstants.JAVA_STRING_TYPE);
|
||||
|
||||
StackValue.coerce(JAVA_STRING_TYPE, returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ public class ToString implements IntrinsicMethod {
|
||||
StackValue receiver,
|
||||
@NotNull GenerationState state
|
||||
) {
|
||||
return genToString(v, receiver, receiver.type);
|
||||
genToString(v, receiver, receiver.type).put(returnType, v);
|
||||
return StackValue.onStack(returnType);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user