ExCallable to Callable renaming

This commit is contained in:
Michael Bogdanov
2015-04-04 11:17:45 +03:00
parent 6213d68553
commit 32d4845606
37 changed files with 115 additions and 159 deletions
@@ -35,7 +35,7 @@ public abstract class CallGenerator {
@Override @Override
public void genCallInner( public void genCallInner(
@NotNull ExtendedCallable callableMethod, @NotNull Callable callableMethod,
ResolvedCall<?> resolvedCall, ResolvedCall<?> resolvedCall,
boolean callDefault, boolean callDefault,
@NotNull ExpressionCodegen codegen @NotNull ExpressionCodegen codegen
@@ -90,7 +90,7 @@ public abstract class CallGenerator {
} }
} }
public void genCall(@NotNull ExtendedCallable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen) { public void genCall(@NotNull Callable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen) {
if (resolvedCall != null) { if (resolvedCall != null) {
JetExpression calleeExpression = resolvedCall.getCall().getCalleeExpression(); JetExpression calleeExpression = resolvedCall.getCall().getCalleeExpression();
if (calleeExpression != null) { if (calleeExpression != null) {
@@ -101,7 +101,7 @@ public abstract class CallGenerator {
genCallInner(callableMethod, resolvedCall, callDefault, codegen); genCallInner(callableMethod, resolvedCall, callDefault, codegen);
} }
public abstract void genCallInner(@NotNull ExtendedCallable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen); public abstract void genCallInner(@NotNull Callable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen);
public abstract void genCallWithoutAssertions(@NotNull CallableMethod callableMethod, @NotNull ExpressionCodegen codegen); public abstract void genCallWithoutAssertions(@NotNull CallableMethod callableMethod, @NotNull ExpressionCodegen codegen);
@@ -16,10 +16,38 @@
package org.jetbrains.kotlin.codegen; package org.jetbrains.kotlin.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
public trait Callable { public trait Callable {
public fun getOwner(): Type
public fun invokeWithNotNullAssertion(v: InstructionAdapter, state: GenerationState, resolvedCall: ResolvedCall<*>)
public fun invokeWithoutAssertions(v: InstructionAdapter)
public fun getGenerateCalleeType(): Type?
public fun getValueParameterTypes(): List<Type>
public fun getArgumentTypes(): Array<Type>
public fun getReturnType(): Type
public fun isStaticCall(): Boolean
public fun getThisType(): Type?
public fun getReceiverClass(): Type?
public fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?)
public fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue
} }
@@ -38,7 +38,7 @@ import org.jetbrains.org.objectweb.asm.util.Printer;
import java.util.ArrayList; import java.util.ArrayList;
public class CallableMethod(private val owner: Type, private val defaultImplOwner: Type?, private val defaultImplParam: Type?, private val signature: JvmMethodSignature, private val invokeOpcode: Int, private val thisClass: Type?, private val receiverParameterType: Type?, private val generateCalleeType: Type?) : ExtendedCallable { public class CallableMethod(private val owner: Type, private val defaultImplOwner: Type?, private val defaultImplParam: Type?, private val signature: JvmMethodSignature, private val invokeOpcode: Int, private val thisClass: Type?, private val receiverParameterType: Type?, private val generateCalleeType: Type?) : Callable {
override fun getOwner(): Type { override fun getOwner(): Type {
return owner return owner
@@ -2255,11 +2255,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Callable callable = resolveToCallable(accessibleFunctionDescriptor, superCall, resolvedCall); Callable callable = resolveToCallable(accessibleFunctionDescriptor, superCall, resolvedCall);
Type returnType = typeMapper.mapReturnType(accessibleFunctionDescriptor); Type returnType = typeMapper.mapReturnType(accessibleFunctionDescriptor);
return ((ExtendedCallable) callable).invokeMethodWithArguments(resolvedCall, receiver, returnType, this); return ((Callable) callable).invokeMethodWithArguments(resolvedCall, receiver, returnType, this);
} }
public void invokeMethodWithArguments( public void invokeMethodWithArguments(
@NotNull ExtendedCallable callable, @NotNull Callable callable,
@NotNull ResolvedCall resolvedCall, @NotNull ResolvedCall resolvedCall,
@NotNull StackValue receiver, @NotNull StackValue receiver,
@NotNull Type returnType @NotNull Type returnType
@@ -2297,7 +2297,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Callable resolveToCallable(@NotNull FunctionDescriptor fd, boolean superCall, @NotNull ResolvedCall resolvedCall) { Callable resolveToCallable(@NotNull FunctionDescriptor fd, boolean superCall, @NotNull ResolvedCall resolvedCall) {
IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(fd); IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(fd);
if (intrinsic != null) { if (intrinsic != null) {
return !intrinsic.supportCallable() ? intrinsic : intrinsic.toCallable(fd, superCall, resolvedCall, this); return intrinsic.toCallable(fd, superCall, resolvedCall, this);
} }
return resolveToCallableMethod(fd, superCall, context); return resolveToCallableMethod(fd, superCall, context);
@@ -2309,7 +2309,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
public void invokeMethodWithArguments( public void invokeMethodWithArguments(
@NotNull ExtendedCallable callableMethod, @NotNull Callable callableMethod,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull StackValue receiver @NotNull StackValue receiver
) { ) {
@@ -2330,7 +2330,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
public void invokeMethodWithArguments( public void invokeMethodWithArguments(
@NotNull ExtendedCallable callableMethod, @NotNull Callable callableMethod,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull StackValue receiver, @NotNull StackValue receiver,
@NotNull CallGenerator callGenerator, @NotNull CallGenerator callGenerator,
@@ -3282,7 +3282,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
boolean keepReturnValue = Boolean.TRUE.equals(bindingContext.get(VARIABLE_REASSIGNMENT, expression)) boolean keepReturnValue = Boolean.TRUE.equals(bindingContext.get(VARIABLE_REASSIGNMENT, expression))
|| !KotlinBuiltIns.getInstance().getUnitType().equals(descriptor.getReturnType()); || !KotlinBuiltIns.getInstance().getUnitType().equals(descriptor.getReturnType());
callAugAssignMethod(expression, resolvedCall, (ExtendedCallable) callable, lhsType, keepReturnValue); callAugAssignMethod(expression, resolvedCall, (Callable) callable, lhsType, keepReturnValue);
return StackValue.none(); return StackValue.none();
} }
@@ -3290,7 +3290,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
private void callAugAssignMethod( private void callAugAssignMethod(
@NotNull JetBinaryExpression expression, @NotNull JetBinaryExpression expression,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull ExtendedCallable callable, @NotNull Callable callable,
@NotNull Type lhsType, @NotNull Type lhsType,
boolean keepReturnValue boolean keepReturnValue
) { ) {
@@ -3643,7 +3643,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 );
ExtendedCallable callableMethod = resolveToCallableMethod(operationDescriptor, false, context); Callable callableMethod = resolveToCallableMethod(operationDescriptor, false, context);
Type[] argumentTypes = callableMethod.getArgumentTypes(); Type[] argumentTypes = callableMethod.getArgumentTypes();
StackValue collectionElementReceiver = StackValue collectionElementReceiver =
@@ -3672,8 +3672,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ResolvedCall<FunctionDescriptor> resolvedCall = isGetter ? resolvedGetCall : resolvedSetCall; ResolvedCall<FunctionDescriptor> resolvedCall = isGetter ? resolvedGetCall : resolvedSetCall;
assert resolvedCall != null : "couldn't find resolved call: " + expression.getText(); assert resolvedCall != null : "couldn't find resolved call: " + expression.getText();
if (callable instanceof ExtendedCallable) { if (callable instanceof Callable) {
ExtendedCallable callableMethod = (ExtendedCallable) callable; Callable callableMethod = (Callable) callable;
ArgumentGenerator argumentGenerator = ArgumentGenerator argumentGenerator =
new CallBasedArgumentGenerator(this, defaultCallGenerator, new CallBasedArgumentGenerator(this, defaultCallGenerator,
resolvedCall.getResultingDescriptor().getValueParameters(), resolvedCall.getResultingDescriptor().getValueParameters(),
@@ -1,70 +0,0 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* 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;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import java.util.List;
public interface ExtendedCallable extends Callable {
@NotNull
Type getOwner();
void invokeWithNotNullAssertion(
@NotNull InstructionAdapter v,
@NotNull GenerationState state,
@NotNull ResolvedCall resolvedCall
);
void invokeWithoutAssertions(@NotNull InstructionAdapter v);
@Nullable
Type getGenerateCalleeType();
@NotNull
List<Type> getValueParameterTypes();
Type[] getArgumentTypes();
@NotNull
Type getReturnType();
boolean isStaticCall();
@Nullable
Type getThisType();
@Nullable
Type getReceiverClass();
void beforeParameterGeneration(@NotNull InstructionAdapter v, @Nullable StackValue value);
@NotNull
StackValue invokeMethodWithArguments(
@NotNull ResolvedCall resolvedCall,
@NotNull StackValue receiver,
@NotNull Type returnType,
@NotNull ExpressionCodegen codegen
);
}
@@ -23,7 +23,6 @@ import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.builtins.PrimitiveType;
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.kotlin.codegen.stackvalue.BranchedValue; import org.jetbrains.kotlin.codegen.stackvalue.BranchedValue;
import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
@@ -41,7 +40,6 @@ import org.jetbrains.org.objectweb.asm.Label;
import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import java.util.Collections;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.codegen.AsmUtil.*; import static org.jetbrains.kotlin.codegen.AsmUtil.*;
@@ -430,7 +428,7 @@ public abstract class StackValue {
ResolvedCall<?> resolvedCall, ResolvedCall<?> resolvedCall,
StackValue receiver, StackValue receiver,
ExpressionCodegen codegen, ExpressionCodegen codegen,
@Nullable ExtendedCallable callableMethod @Nullable Callable callableMethod
) { ) {
if (resolvedCall.getDispatchReceiver().exists() || resolvedCall.getExtensionReceiver().exists() || isLocalFunCall(callableMethod)) { if (resolvedCall.getDispatchReceiver().exists() || resolvedCall.getExtensionReceiver().exists() || isLocalFunCall(callableMethod)) {
boolean hasExtensionReceiver = resolvedCall.getExtensionReceiver().exists(); boolean hasExtensionReceiver = resolvedCall.getExtensionReceiver().exists();
@@ -449,7 +447,7 @@ public abstract class StackValue {
@NotNull StackValue receiver, @NotNull StackValue receiver,
@NotNull ExpressionCodegen codegen, @NotNull ExpressionCodegen codegen,
@NotNull ResolvedCall resolvedCall, @NotNull ResolvedCall resolvedCall,
@Nullable ExtendedCallable callableMethod, @Nullable Callable callableMethod,
boolean isExtension boolean isExtension
) { ) {
ReceiverValue receiverValue = isExtension ? resolvedCall.getExtensionReceiver() : resolvedCall.getDispatchReceiver(); ReceiverValue receiverValue = isExtension ? resolvedCall.getExtensionReceiver() : resolvedCall.getDispatchReceiver();
@@ -483,7 +481,7 @@ public abstract class StackValue {
} }
@Contract("null -> false") @Contract("null -> false")
private static boolean isLocalFunCall(@Nullable ExtendedCallable callableMethod) { private static boolean isLocalFunCall(@Nullable Callable callableMethod) {
return callableMethod != null && callableMethod.getGenerateCalleeType() != null; return callableMethod != null && callableMethod.getGenerateCalleeType() != null;
} }
@@ -716,8 +714,8 @@ public abstract class StackValue {
@NotNull Type type, @NotNull InstructionAdapter v @NotNull Type type, @NotNull InstructionAdapter v
) { ) {
ResolvedCall<?> call = isGetter ? resolvedGetCall : resolvedSetCall; ResolvedCall<?> call = isGetter ? resolvedGetCall : resolvedSetCall;
if (callable instanceof ExtendedCallable) { if (callable instanceof Callable) {
StackValue newReceiver = StackValue.receiver(call, receiver, codegen, (ExtendedCallable) callable); StackValue newReceiver = StackValue.receiver(call, receiver, codegen, (Callable) callable);
newReceiver.put(newReceiver.type, v); newReceiver.put(newReceiver.type, v);
argumentGenerator.generate(valueArguments); argumentGenerator.generate(valueArguments);
} }
@@ -860,8 +858,8 @@ public abstract class StackValue {
} }
public static class CollectionElement extends StackValueWithSimpleReceiver { public static class CollectionElement extends StackValueWithSimpleReceiver {
private final ExtendedCallable getter; private final Callable getter;
private final ExtendedCallable setter; private final Callable setter;
private final ExpressionCodegen codegen; private final ExpressionCodegen codegen;
private final GenerationState state; private final GenerationState state;
private final ResolvedCall<FunctionDescriptor> resolvedGetCall; private final ResolvedCall<FunctionDescriptor> resolvedGetCall;
@@ -884,9 +882,9 @@ public abstract class StackValue {
this.setterDescriptor = resolvedSetCall == null ? null : resolvedSetCall.getResultingDescriptor(); this.setterDescriptor = resolvedSetCall == null ? null : resolvedSetCall.getResultingDescriptor();
this.getterDescriptor = resolvedGetCall == null ? null : resolvedGetCall.getResultingDescriptor(); this.getterDescriptor = resolvedGetCall == null ? null : resolvedGetCall.getResultingDescriptor();
this.setter = this.setter =
resolvedSetCall == null ? null : (ExtendedCallable) codegen.resolveToCallable(setterDescriptor, false, resolvedSetCall); resolvedSetCall == null ? null : (Callable) codegen.resolveToCallable(setterDescriptor, false, resolvedSetCall);
this.getter = this.getter =
resolvedGetCall == null ? null : (ExtendedCallable) codegen.resolveToCallable(getterDescriptor, false, resolvedGetCall); resolvedGetCall == null ? null : (Callable) codegen.resolveToCallable(getterDescriptor, false, resolvedGetCall);
this.codegen = codegen; this.codegen = codegen;
} }
@@ -1239,7 +1237,7 @@ public abstract class StackValue {
value = StackValue.complexReceiver(value, true, false, true); value = StackValue.complexReceiver(value, true, false, true);
value.put(this.type, v); value.put(this.type, v);
if (callable instanceof ExtendedCallable) { if (callable instanceof Callable) {
value.store(codegen.invokeFunction(resolvedCall, StackValue.onStack(this.type)), v, true); value.store(codegen.invokeFunction(resolvedCall, StackValue.onStack(this.type)), v, true);
} }
else { else {
@@ -1269,7 +1267,7 @@ public abstract class StackValue {
public static Type calcType( public static Type calcType(
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull JetTypeMapper typeMapper, @NotNull JetTypeMapper typeMapper,
@Nullable ExtendedCallable callableMethod @Nullable Callable callableMethod
) { ) {
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
@@ -125,7 +125,7 @@ public class InlineCodegen extends CallGenerator {
} }
@Override @Override
public void genCallInner(@NotNull ExtendedCallable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen) { public void genCallInner(@NotNull Callable callableMethod, @Nullable ResolvedCall<?> resolvedCall, boolean callDefault, @NotNull ExpressionCodegen codegen) {
SMAPAndMethodNode nodeAndSmap = null; SMAPAndMethodNode nodeAndSmap = null;
try { try {
@@ -22,7 +22,7 @@ import kotlin.Unit;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.codegen.CallableMethod; import org.jetbrains.kotlin.codegen.CallableMethod;
import org.jetbrains.kotlin.codegen.ExpressionCodegen; import org.jetbrains.kotlin.codegen.ExpressionCodegen;
import org.jetbrains.kotlin.codegen.ExtendedCallable; import org.jetbrains.kotlin.codegen.Callable;
import org.jetbrains.kotlin.codegen.StackValue; import org.jetbrains.kotlin.codegen.StackValue;
import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.Type;
@@ -56,7 +56,7 @@ public class ArrayGet extends LazyIntrinsicMethod {
@NotNull @NotNull
@Override @Override
public ExtendedCallable toCallable(@NotNull CallableMethod method) { public Callable toCallable(@NotNull CallableMethod method) {
return new MappedCallable(method, new ExtensionFunction1<MappedCallable, InstructionAdapter, Unit>() { return new MappedCallable(method, new ExtensionFunction1<MappedCallable, InstructionAdapter, Unit>() {
@Override @Override
public Unit invoke( public Unit invoke(
@@ -35,7 +35,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses import org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.CodegenContext
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType
@@ -71,7 +71,7 @@ public class ArrayIterator : IntrinsicMethod() {
} }
//TODO refactor //TODO refactor
override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean): ExtendedCallable { override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean): Callable {
val callableMethod = state.getTypeMapper().mapToCallableMethod(fd, false, context) val callableMethod = state.getTypeMapper().mapToCallableMethod(fd, false, context)
val containingDeclaration = fd.getContainingDeclaration().getOriginal() as ClassDescriptor val containingDeclaration = fd.getContainingDeclaration().getOriginal() as ClassDescriptor
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -43,7 +43,7 @@ public class ArraySet : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
val type = correctElementType(method.getThisType()) val type = correctElementType(method.getThisType())
return object: IntrinsicCallable(Type.VOID_TYPE, listOf(Type.INT_TYPE, type), method.getThisType(), method.getReceiverClass()) { return object: IntrinsicCallable(Type.VOID_TYPE, listOf(Type.INT_TYPE, type), method.getThisType(), method.getReceiverClass()) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
@@ -20,7 +20,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
@@ -38,7 +38,7 @@ public class ArraySize : LazyIntrinsicMethod() {
} }
} }
public override fun toCallable(method: CallableMethod): ExtendedCallable { public override fun toCallable(method: CallableMethod): Callable {
return UnaryIntrinsic(method, null, false) { adapter -> return UnaryIntrinsic(method, null, false) { adapter ->
adapter.arraylength() adapter.arraylength()
} }
@@ -27,7 +27,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes.*
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.CodegenContext
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -62,7 +62,7 @@ public class BinaryOp(private val opcode: Int) : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
val returnType = method.getReturnType() val returnType = method.getReturnType()
assert(method.getValueParameters().size() == 1) assert(method.getValueParameters().size() == 1)
val operandType = numberFunctionOperandType(returnType) val operandType = numberFunctionOperandType(returnType)
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetElement
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
@@ -56,7 +56,7 @@ public class Clone : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod, isSuperCall: Boolean): ExtendedCallable { override fun toCallable(method: CallableMethod, isSuperCall: Boolean): Callable {
return UnaryIntrinsic(method, OBJECT_TYPE) { return UnaryIntrinsic(method, OBJECT_TYPE) {
val opcodes: Int = if (isSuperCall) Opcodes.INVOKESPECIAL else Opcodes.INVOKEVIRTUAL val opcodes: Int = if (isSuperCall) Opcodes.INVOKESPECIAL else Opcodes.INVOKEVIRTUAL
it.visitMethodInsn(opcodes, "java/lang/Object", "clone", "()Ljava/lang/Object;", false) it.visitMethodInsn(opcodes, "java/lang/Object", "clone", "()Ljava/lang/Object;", false)
@@ -25,7 +25,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.kotlin.codegen.AsmUtil.comparisonOperandType import org.jetbrains.kotlin.codegen.AsmUtil.comparisonOperandType
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
public class CompareTo : IntrinsicMethod() { public class CompareTo : IntrinsicMethod() {
override fun generateImpl(codegen: ExpressionCodegen, v: InstructionAdapter, returnType: Type, element: PsiElement?, arguments: List<JetExpression>, receiver: StackValue): Type { override fun generateImpl(codegen: ExpressionCodegen, v: InstructionAdapter, returnType: Type, element: PsiElement?, arguments: List<JetExpression>, receiver: StackValue): Type {
@@ -74,7 +74,7 @@ public class CompareTo : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
val argumentType = comparisonOperandType(method.getThisType() ?: method.getReceiverClass(), method.getArgumentTypes().first()) val argumentType = comparisonOperandType(method.getThisType() ?: method.getReceiverClass(), method.getArgumentTypes().first())
return IntrinsicCallable.binaryIntrinsic(method.getReturnType(), argumentType, argumentType, null) { return IntrinsicCallable.binaryIntrinsic(method.getReturnType(), argumentType, argumentType, null) {
genInvoke(argumentType, it) genInvoke(argumentType, it)
@@ -27,7 +27,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.kotlin.codegen.AsmUtil.genInvokeAppendMethod import org.jetbrains.kotlin.codegen.AsmUtil.genInvokeAppendMethod
import org.jetbrains.kotlin.codegen.AsmUtil.genStringBuilderConstructor import org.jetbrains.kotlin.codegen.AsmUtil.genStringBuilderConstructor
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetBinaryExpression import org.jetbrains.kotlin.psi.JetBinaryExpression
@@ -63,7 +63,7 @@ public class Concat : IntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext()) val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext())
return object : MappedCallable(callable, {}) { return object : MappedCallable(callable, {}) {
override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue {
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.CodegenContext
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
@@ -52,7 +52,7 @@ public class CopyToArray : IntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
return object : IntrinsicCallable(getType(javaClass<Array<Any>>()), listOf(), null, Type.getType(javaClass<Collection<*>>())) { return object : IntrinsicCallable(getType(javaClass<Array<Any>>()), listOf(), null, Type.getType(javaClass<Collection<*>>())) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
v.dup() v.dup()
@@ -48,7 +48,7 @@ public class Equals : LazyIntrinsicMethod() {
return genEqualsForExpressionsOnStack(JetTokens.EQEQ, leftExpr, codegen.genLazy(rightExpr, OBJECT_TYPE)) return genEqualsForExpressionsOnStack(JetTokens.EQEQ, leftExpr, codegen.genLazy(rightExpr, OBJECT_TYPE))
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return IntrinsicCallable.binaryIntrinsic(method.getReturnType(), OBJECT_TYPE, nullOrObject(method.getThisType()), nullOrObject(method.getReceiverClass())) { return IntrinsicCallable.binaryIntrinsic(method.getReturnType(), OBJECT_TYPE, nullOrObject(method.getThisType()), nullOrObject(method.getReceiverClass())) {
AsmUtil.genAreEqualCall(it) AsmUtil.genAreEqualCall(it)
} }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -41,7 +41,7 @@ public class HashCode : LazyIntrinsicMethod() {
} }
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return object: IntrinsicCallable(Type.INT_TYPE, emptyList(), nullOrObject(method.getThisType()), nullOrObject(method.getReceiverClass())) { return object: IntrinsicCallable(Type.INT_TYPE, emptyList(), nullOrObject(method.getThisType()), nullOrObject(method.getReceiverClass())) {
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)
@@ -50,7 +50,7 @@ public class IdentityEquals : LazyIntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext()) val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext())
return object : MappedCallable(callable) { return object : MappedCallable(callable) {
override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue {
@@ -24,7 +24,7 @@ import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.kotlin.codegen.AsmUtil.genIncrement import org.jetbrains.kotlin.codegen.AsmUtil.genIncrement
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.psi.JetPrefixExpression import org.jetbrains.kotlin.psi.JetPrefixExpression
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
@@ -57,7 +57,7 @@ public class Increment(private val myDelta: Int) : LazyIntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val method = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext()) val method = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext())
return MappedCallable(method) { return MappedCallable(method) {
val jetExpression = resolvedCall.getCall().getCalleeExpression() val jetExpression = resolvedCall.getCall().getCalleeExpression()
@@ -28,7 +28,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
public abstract class IntrinsicCallable(val returnType1: Type, public abstract class IntrinsicCallable(val returnType1: Type,
val valueParametersTypes: List<Type>, val valueParametersTypes: List<Type>,
val thisType1: Type?, val thisType1: Type?,
val receiverType1: Type?) : ExtendedCallable { val receiverType1: Type?) : Callable {
companion object { companion object {
fun create(descriptor: FunctionDescriptor, context: CodegenContext<*>, state: GenerationState, lambda: IntrinsicCallable.(i: InstructionAdapter) -> Unit): IntrinsicCallable { fun create(descriptor: FunctionDescriptor, context: CodegenContext<*>, state: GenerationState, lambda: IntrinsicCallable.(i: InstructionAdapter) -> Unit): IntrinsicCallable {
@@ -79,7 +79,7 @@ public abstract class IntrinsicCallable(val returnType1: Type,
public abstract fun invokeIntrinsic(v: InstructionAdapter); public abstract fun invokeIntrinsic(v: InstructionAdapter);
override fun getArgumentTypes(): Array<out Type>? { override fun getArgumentTypes(): Array<Type> {
throw UnsupportedOperationException() throw UnsupportedOperationException()
} }
@@ -37,7 +37,7 @@ import java.util.List;
import static org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType; import static org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType;
public abstract class IntrinsicMethod implements Callable { public abstract class IntrinsicMethod {
public StackValue generate( public StackValue generate(
@NotNull final ExpressionCodegen codegen, @NotNull final ExpressionCodegen codegen,
@NotNull final Type returnType, @NotNull final Type returnType,
@@ -70,29 +70,29 @@ public abstract class IntrinsicMethod implements Callable {
} }
@NotNull @NotNull
public ExtendedCallable toCallable(@NotNull FunctionDescriptor fd, boolean isSuper, @NotNull ResolvedCall resolvedCall, @NotNull ExpressionCodegen codegen) { public Callable toCallable(@NotNull FunctionDescriptor fd, boolean isSuper, @NotNull ResolvedCall resolvedCall, @NotNull ExpressionCodegen codegen) {
return toCallable(codegen.getState(), fd, codegen.getContext(), isSuper, resolvedCall); return toCallable(codegen.getState(), fd, codegen.getContext(), isSuper, resolvedCall);
} }
@NotNull @NotNull
public ExtendedCallable toCallable(@NotNull GenerationState state, @NotNull FunctionDescriptor fd, @NotNull CodegenContext<?> context, boolean isSuper, @NotNull public Callable toCallable(@NotNull GenerationState state, @NotNull FunctionDescriptor fd, @NotNull CodegenContext<?> context, boolean isSuper, @NotNull
ResolvedCall resolvedCall) { ResolvedCall resolvedCall) {
return toCallable(state, fd, context, isSuper); return toCallable(state, fd, context, isSuper);
} }
@NotNull @NotNull
public ExtendedCallable toCallable(@NotNull GenerationState state, @NotNull FunctionDescriptor fd, @NotNull CodegenContext<?> context, boolean isSuper) { public Callable toCallable(@NotNull GenerationState state, @NotNull FunctionDescriptor fd, @NotNull CodegenContext<?> context, boolean isSuper) {
return toCallable(state.getTypeMapper().mapToCallableMethod(fd, false, context), isSuper); return toCallable(state.getTypeMapper().mapToCallableMethod(fd, false, context), isSuper);
} }
@NotNull @NotNull
public ExtendedCallable toCallable(@NotNull CallableMethod method, boolean isSuperCall) { public Callable toCallable(@NotNull CallableMethod method, boolean isSuperCall) {
//assert !isSuper; //assert !isSuper;
return toCallable(method); return toCallable(method);
} }
@NotNull @NotNull
public ExtendedCallable toCallable(@NotNull CallableMethod method) { public Callable toCallable(@NotNull CallableMethod method) {
throw new UnsupportedOperationException("Not implemented"); throw new UnsupportedOperationException("Not implemented");
} }
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -47,7 +47,7 @@ public class Inv : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
val type = numberFunctionOperandType(method.getReturnType()) val type = numberFunctionOperandType(method.getReturnType())
return UnaryIntrinsic(method, method.getReturnType(), newThisType = type) { return UnaryIntrinsic(method, method.getReturnType(), newThisType = type) {
if (getReturnType() == Type.LONG_TYPE) { if (getReturnType() == Type.LONG_TYPE) {
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -76,7 +76,7 @@ public class IteratorNext : IntrinsicMethod() {
} }
override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean): ExtendedCallable { override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean): Callable {
val type = state.getTypeMapper().mapReturnType(fd) val type = state.getTypeMapper().mapReturnType(fd)
return object: IntrinsicCallable(type, listOf(), AsmTypes.OBJECT_TYPE, null) { return object: IntrinsicCallable(type, listOf(), AsmTypes.OBJECT_TYPE, null) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
@@ -46,7 +46,7 @@ public class JavaClassArray : IntrinsicMethod() {
return true return true
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return MappedCallable(method) { return MappedCallable(method) {
//do nothing all generated as vararg //do nothing all generated as vararg
} }
@@ -29,7 +29,7 @@ import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.kotlin.codegen.AsmUtil.putJavaLangClassInstance import org.jetbrains.kotlin.codegen.AsmUtil.putJavaLangClassInstance
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType
@@ -52,7 +52,7 @@ public class JavaClassFunction : IntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val javaClass = resolvedCall.getResultingDescriptor().getReturnType()!!.getArguments().get(0).getType() val javaClass = resolvedCall.getResultingDescriptor().getReturnType()!!.getArguments().get(0).getType()
return object: IntrinsicCallable(getType(javaClass<Class<Any>>()), listOf(), null, null) { return object: IntrinsicCallable(getType(javaClass<Class<Any>>()), listOf(), null, null) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
@@ -26,7 +26,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.kotlin.codegen.AsmUtil.boxType import org.jetbrains.kotlin.codegen.AsmUtil.boxType
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType import org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType
@@ -53,7 +53,7 @@ public class JavaClassProperty : IntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val classType = codegen.getState().getTypeMapper().mapType(resolvedCall.getCall().getDispatchReceiver().getType()) val classType = codegen.getState().getTypeMapper().mapType(resolvedCall.getCall().getDispatchReceiver().getType())
return object : IntrinsicCallable(getType(javaClass<Class<Any>>()), listOf(), classType, null) { return object : IntrinsicCallable(getType(javaClass<Class<Any>>()), listOf(), classType, null) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.CodegenContext
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
@@ -65,7 +65,7 @@ public class MonitorInstruction private(private val opcode: Int) : IntrinsicMeth
return true return true
} }
override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean, resolvedCall: ResolvedCall<*>): ExtendedCallable { override fun toCallable(state: GenerationState, fd: FunctionDescriptor, context: CodegenContext<*>, isSuper: Boolean, resolvedCall: ResolvedCall<*>): Callable {
return object : IntrinsicCallable(Type.VOID_TYPE, listOf(OBJECT_TYPE), null, null) { return object : IntrinsicCallable(Type.VOID_TYPE, listOf(OBJECT_TYPE), null, null) {
override fun invokeIntrinsic(v: InstructionAdapter) { override fun invokeIntrinsic(v: InstructionAdapter) {
v.visitInsn(opcode) v.visitInsn(opcode)
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -33,7 +33,7 @@ public class NewArray : LazyIntrinsicMethod() {
return codegen.generateNewArray(element as JetCallExpression) return codegen.generateNewArray(element as JetCallExpression)
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val jetType = resolvedCall.getResultingDescriptor().getReturnType()!! val jetType = resolvedCall.getResultingDescriptor().getReturnType()!!
val type = codegen.getState().getTypeMapper().mapType(jetType) val type = codegen.getState().getTypeMapper().mapType(jetType)
return object : IntrinsicCallable(type, listOf(Type.INT_TYPE), null, null) { return object : IntrinsicCallable(type, listOf(Type.INT_TYPE), null, null) {
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.psi.JetCallExpression import org.jetbrains.kotlin.psi.JetCallExpression
@@ -44,7 +44,7 @@ public class Not : LazyIntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext()) val callable = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext())
return object : MappedCallable(callable, {}) { return object : MappedCallable(callable, {}) {
override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue {
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -30,7 +30,7 @@ public class NumberCast : LazyIntrinsicMethod() {
return StackValue.coercion(receiver, returnType) return StackValue.coercion(receiver, returnType)
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return UnaryIntrinsic(method) { return UnaryIntrinsic(method) {
StackValue.coerce(calcReceiverType()!!, getReturnType(), it) StackValue.coerce(calcReceiverType()!!, getReturnType(), it)
} }
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.psi.JetBinaryExpression import org.jetbrains.kotlin.psi.JetBinaryExpression
@@ -99,7 +99,7 @@ public class RangeTo : IntrinsicMethod() {
return true return true
} }
override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): ExtendedCallable { override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable {
val method = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext()) val method = codegen.getState().getTypeMapper().mapToCallableMethod(fd, false, codegen.getContext())
val argType = nameToPrimitive(method.getReturnType().getInternalName().substringAfter("kotlin/").substringBefore("Range")) val argType = nameToPrimitive(method.getReturnType().getInternalName().substringAfter("kotlin/").substringBefore("Range"))
return object : IntrinsicCallable(method.getReturnType(), method.getValueParameterTypes().map { argType }, nullOr(method.getThisType(), argType), nullOr(method.getReceiverClass(), argType)) { return object : IntrinsicCallable(method.getReturnType(), method.getValueParameterTypes().map { argType }, nullOr(method.getThisType(), argType), nullOr(method.getReceiverClass(), argType)) {
@@ -20,7 +20,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.CodegenContext
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
@@ -46,7 +46,7 @@ public class StringGetChar : LazyIntrinsicMethod() {
} }
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return IntrinsicCallable.create(method) { return IntrinsicCallable.create(method) {
it.invokevirtual("java/lang/String", "charAt", "(I)C", false) it.invokevirtual("java/lang/String", "charAt", "(I)C", false)
} }
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -47,7 +47,7 @@ public class StringPlus : LazyIntrinsicMethod() {
} }
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return IntrinsicCallable.create(method) { return IntrinsicCallable.create(method) {
it.invokestatic("kotlin/jvm/internal/Intrinsics", "stringPlus", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;", false) it.invokestatic("kotlin/jvm/internal/Intrinsics", "stringPlus", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;", false)
} }
@@ -36,7 +36,7 @@ public class ToString : LazyIntrinsicMethod() {
return genToString(receiver, receiver.type) return genToString(receiver, receiver.type)
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
val type = AsmUtil.stringValueOfType(method.getThisType() ?: method.getReceiverClass()) val type = AsmUtil.stringValueOfType(method.getThisType() ?: method.getReceiverClass())
return UnaryIntrinsic(method, newThisType = type) { return UnaryIntrinsic(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)
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.AsmUtil.* import org.jetbrains.kotlin.codegen.AsmUtil.*
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.psi.JetExpression
public class UnaryMinus : LazyIntrinsicMethod() { public class UnaryMinus : LazyIntrinsicMethod() {
@@ -46,7 +46,7 @@ public class UnaryMinus : LazyIntrinsicMethod() {
} }
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return UnaryIntrinsic(method, numberFunctionOperandType(method.getReturnType()), needPrimitiveCheck = true) { return UnaryIntrinsic(method, numberFunctionOperandType(method.getReturnType()), needPrimitiveCheck = true) {
it.neg(getReturnType()) it.neg(getReturnType())
} }
@@ -24,7 +24,7 @@ import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.CallableMethod
import org.jetbrains.kotlin.codegen.ExtendedCallable import org.jetbrains.kotlin.codegen.Callable
public class UnaryPlus : LazyIntrinsicMethod() { public class UnaryPlus : LazyIntrinsicMethod() {
override fun generateImpl(codegen: ExpressionCodegen, returnType: Type, element: PsiElement?, arguments: List<JetExpression>, receiver: StackValue): StackValue { override fun generateImpl(codegen: ExpressionCodegen, returnType: Type, element: PsiElement?, arguments: List<JetExpression>, receiver: StackValue): StackValue {
@@ -39,7 +39,7 @@ public class UnaryPlus : LazyIntrinsicMethod() {
} }
} }
override fun toCallable(method: CallableMethod): ExtendedCallable { override fun toCallable(method: CallableMethod): Callable {
return UnaryIntrinsic(method, needPrimitiveCheck = true) { return UnaryIntrinsic(method, needPrimitiveCheck = true) {
//nothing //nothing
} }