From b3fef4a7a063eb3c9854b9f65b4f7175ca41d0b5 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 20 May 2014 15:47:28 +0400 Subject: [PATCH] Substitute Call with JetElement in InliningContext to support default inlining (there is no call) --- .../jet/codegen/ExpressionCodegen.java | 19 ++++++++++++------- .../inline/AnonymousObjectTransformer.java | 2 +- .../jet/codegen/inline/InlineCodegen.java | 12 ++++++------ .../codegen/inline/RootInliningContext.java | 10 ++++++---- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 000b1979235..d117f4c9e7e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2070,14 +2070,9 @@ public class ExpressionCodegen extends JetVisitor implem @NotNull StackValue receiver ) { CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); - boolean isInline = state.isInlineEnabled() && - call != null && - descriptor instanceof SimpleFunctionDescriptor && - ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); + JetElement callElement = call != null ? call.getCallElement() : null; - CallGenerator callGenerator = !isInline ? defaultCallGenerator : - new InlineCodegen(this, state, (SimpleFunctionDescriptor) DescriptorUtils.unwrapFakeOverride( - (CallableMemberDescriptor) descriptor.getOriginal()), call); + CallGenerator callGenerator = getOrCreateCallGenerator(descriptor, callElement); if (resolvedCall instanceof VariableAsFunctionResolvedCall) { resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall(); @@ -2096,6 +2091,16 @@ public class ExpressionCodegen extends JetVisitor implem callGenerator.genCall(callableMethod, resolvedCall, mask, this); } + protected CallGenerator getOrCreateCallGenerator(CallableDescriptor descriptor, JetElement callElement) { + boolean isInline = state.isInlineEnabled() && + descriptor instanceof SimpleFunctionDescriptor && + ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); + + return !isInline || callElement == null ? defaultCallGenerator : + new InlineCodegen(this, state, (SimpleFunctionDescriptor) DescriptorUtils.unwrapFakeOverride( + (CallableMemberDescriptor) descriptor.getOriginal()), callElement); + } + public void generateFromResolvedCall(@NotNull ReceiverValue descriptor, @NotNull Type type) { if (descriptor instanceof ClassReceiver) { Type exprType = asmType(descriptor.getType()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java index a8acc84786d..ba713728a9f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java @@ -275,7 +275,7 @@ public class AnonymousObjectTransformer { @NotNull private ClassBuilder createClassBuilder() { - return new RemappingClassBuilder(state.getFactory().forLambdaInlining(newLambdaType, inliningContext.getRoot().call.getCallElement().getContainingFile()), + return new RemappingClassBuilder(state.getFactory().forLambdaInlining(newLambdaType, inliningContext.getRoot().callElement.getContainingFile()), new TypeRemapper(inliningContext.typeMapping)); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java index e8fc192bd8a..92f86c7a7fa 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java @@ -64,7 +64,7 @@ public class InlineCodegen implements CallGenerator { private final SimpleFunctionDescriptor functionDescriptor; private final JvmMethodSignature jvmSignature; - private final Call call; + private final JetElement callElement; private final MethodContext context; private final ExpressionCodegen codegen; private final FrameMap originalFunctionFrame; @@ -81,14 +81,14 @@ public class InlineCodegen implements CallGenerator { @NotNull ExpressionCodegen codegen, @NotNull GenerationState state, @NotNull SimpleFunctionDescriptor functionDescriptor, - @NotNull Call call + @NotNull JetElement callElement ) { assert functionDescriptor.getInlineStrategy().isInline() : "InlineCodegen could inline only inline function but " + functionDescriptor; this.state = state; this.typeMapper = state.getTypeMapper(); this.codegen = codegen; - this.call = call; + this.callElement = callElement; this.functionDescriptor = functionDescriptor.getOriginal(); bindingContext = codegen.getBindingContext(); initialFrameSize = codegen.getFrameMap().getCurrentSize(); @@ -126,7 +126,7 @@ public class InlineCodegen implements CallGenerator { functionDescriptor.getName() + "' into \n" + (element != null ? element.getText() : "null psi element " + this.codegen.getContext().getContextDescriptor()) + (generateNodeText ? ("\ncause: " + getNodeText(node)) : ""), - e, call.getCallElement()); + e, callElement); } @@ -201,10 +201,10 @@ public class InlineCodegen implements CallGenerator { codegen.getInlineNameGenerator() .subGenerator(functionDescriptor.getName().asString()), codegen.getContext(), - call, + callElement, codegen.getParentCodegen().getClassName()); - MethodInliner inliner = new MethodInliner(node, parameters, info, new FieldRemapper(null, null, parameters), isSameModule, "Method inlining " + call.getCallElement().getText()); //with captured + MethodInliner inliner = new MethodInliner(node, parameters, info, new FieldRemapper(null, null, parameters), isSameModule, "Method inlining " + callElement.getText()); //with captured LocalVarRemapper remapper = new LocalVarRemapper(parameters, initialFrameSize); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RootInliningContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RootInliningContext.java index aecea68d782..49ba7c23fc9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RootInliningContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RootInliningContext.java @@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.Call; +import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.psi.JetExpression; import java.util.Collections; import java.util.Map; @@ -28,21 +30,20 @@ public class RootInliningContext extends InliningContext { public final CodegenContext startContext; - @NotNull private final String classNameToInline; - public final Call call; + public final JetElement callElement; public RootInliningContext( @NotNull Map map, @NotNull GenerationState state, @NotNull NameGenerator nameGenerator, @NotNull CodegenContext startContext, - @NotNull Call call, + @NotNull JetElement callElement, @NotNull String classNameToInline ) { super(null, map, state, nameGenerator, Collections.emptyMap(), false, false); - this.call = call; + this.callElement = callElement; this.startContext = startContext; this.classNameToInline = classNameToInline; } @@ -52,6 +53,7 @@ public class RootInliningContext extends InliningContext { return true; } + @Override @NotNull public String getClassNameToInline() { return classNameToInline;