Minor: extract optimized loop codegen creation logic for optimized 'for' cases.

There will be some more of those, and they all require some ad hock processing.
This commit is contained in:
Dmitry Petrov
2016-07-01 11:48:47 +03:00
parent d45330c184
commit e187f799d9
@@ -600,17 +600,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
private void generateFor(@NotNull KtForExpression forExpression) {
ResolvedCall<? extends CallableDescriptor> loopRangeCall = RangeCodegenUtil.getLoopRangeResolvedCall(forExpression, bindingContext);
if (loopRangeCall != null) {
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
generateForLoop(createForInRangeLiteralLoopGenerator(forExpression, loopRangeCall));
return;
}
else if (RangeCodegenUtil.isArrayOrPrimitiveArrayIndices(loopRangeCallee)) {
generateForLoop(createForInArrayIndicesRangeLoopGenerator(forExpression, loopRangeCall));
return;
}
else if (RangeCodegenUtil.isCollectionIndices(loopRangeCallee)) {
generateForLoop(createForInCollectionIndicesRangeLoopGenerator(forExpression, loopRangeCall));
AbstractForLoopGenerator optimizedForLoopGenerator = createOptimizedForLoopGeneratorOrNull(forExpression, loopRangeCall);
if (optimizedForLoopGenerator != null) {
generateForLoop(optimizedForLoopGenerator);
return;
}
}
@@ -634,31 +626,33 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
}
}
private AbstractForLoopGenerator createForInRangeLiteralLoopGenerator(
@Nullable
private AbstractForLoopGenerator createOptimizedForLoopGeneratorOrNull(
@NotNull KtForExpression forExpression,
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
) {
ReceiverValue from = loopRangeCall.getDispatchReceiver();
KtExpression to = loopRangeCall.getValueArgumentsByIndex().get(0).getArguments().get(0).getArgumentExpression();
return new ForInRangeLiteralLoopGenerator(forExpression, from, to);
}
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
ReceiverValue from = loopRangeCall.getDispatchReceiver();
assert from != null : "Dispatch receiver should be non-null for optimizable 'rangeTo' call";
List<ResolvedValueArgument> valueArgumentsByIndex = loopRangeCall.getValueArgumentsByIndex();
assert valueArgumentsByIndex != null : "Value arguments should be non-null for optimizable 'rangeTo' call";
KtExpression to = valueArgumentsByIndex.get(0).getArguments().get(0).getArgumentExpression();
assert to != null : "1st value argument should be non-null for optimizable 'rangeTo' call";
return new ForInRangeLiteralLoopGenerator(forExpression, from, to);
}
else if (RangeCodegenUtil.isArrayOrPrimitiveArrayIndices(loopRangeCallee)) {
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'Array.indices' call";
return new ForInArrayIndicesRangeLoopGenerator(forExpression, extensionReceiver);
}
else if (RangeCodegenUtil.isCollectionIndices(loopRangeCallee)) {
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'Collection.indices' call";
return new ForInCollectionIndicesRangeLoopGenerator(forExpression, extensionReceiver);
}
private AbstractForLoopGenerator createForInCollectionIndicesRangeLoopGenerator(
@NotNull KtForExpression forExpression,
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
) {
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'indices' call";
return new ForInCollectionIndicesRangeLoopGenerator(forExpression, extensionReceiver);
}
private AbstractForLoopGenerator createForInArrayIndicesRangeLoopGenerator(
@NotNull KtForExpression forExpression,
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
) {
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'indices' call";
return new ForInArrayIndicesRangeLoopGenerator(forExpression, extensionReceiver);
return null;
}
private OwnerKind contextKind() {