Creating loop parameter var once.

This commit is contained in:
Evgeny Gerashchenko
2013-02-08 16:14:48 +04:00
parent 83fa1e95e6
commit da48a11374
@@ -522,7 +522,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
protected final JetForExpression forExpression; protected final JetForExpression forExpression;
private final Label bodyStart = new Label(); private final Label bodyStart = new Label();
private final Label bodyEnd = new Label(); private final Label bodyEnd = new Label();
private final List<Runnable> leaveVariableTasks = Lists.newArrayList(); private final List<Runnable> afterBodyLeaveVariableTasks = Lists.newArrayList();
private final List<Runnable> afterLoopLeaveVariableTasks = Lists.newArrayList();
protected final JetType elementType; protected final JetType elementType;
@@ -544,19 +545,14 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return nextCall.getResultingDescriptor().getReturnType(); return nextCall.getResultingDescriptor().getReturnType();
} }
public abstract void beforeLoop(); public void beforeLoop() {
public abstract void conditionAndJump(@NotNull Label loopExit);
public void beforeBody() {
v.mark(bodyStart);
JetParameter loopParameter = forExpression.getLoopParameter(); JetParameter loopParameter = forExpression.getLoopParameter();
if (loopParameter != null) { if (loopParameter != null) {
// E e = tmp<iterator>.next() // E e = tmp<iterator>.next()
final VariableDescriptor parameterDescriptor = bindingContext.get(BindingContext.VALUE_PARAMETER, loopParameter); final VariableDescriptor parameterDescriptor = bindingContext.get(BindingContext.VALUE_PARAMETER, loopParameter);
@SuppressWarnings("ConstantConditions") final Type asmTypeForParameter = asmType(parameterDescriptor.getType()); @SuppressWarnings("ConstantConditions") final Type asmTypeForParameter = asmType(parameterDescriptor.getType());
loopParameterVar = myFrameMap.enter(parameterDescriptor, asmTypeForParameter); loopParameterVar = myFrameMap.enter(parameterDescriptor, asmTypeForParameter);
leaveVariableTasks.add(new Runnable() { afterLoopLeaveVariableTasks.add(new Runnable() {
@Override @Override
public void run() { public void run() {
myFrameMap.leave(parameterDescriptor); myFrameMap.leave(parameterDescriptor);
@@ -566,7 +562,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
loopParameterVar); loopParameterVar);
} }
}); });
assignToLoopParameter();
} }
else { else {
JetMultiDeclaration multiParameter = forExpression.getMultiParameter(); JetMultiDeclaration multiParameter = forExpression.getMultiParameter();
@@ -575,20 +570,30 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
// E tmp<e> = tmp<iterator>.next() // E tmp<e> = tmp<iterator>.next()
final Type asmElementType = asmType(elementType); final Type asmElementType = asmType(elementType);
loopParameterVar = myFrameMap.enterTemp(asmElementType); loopParameterVar = myFrameMap.enterTemp(asmElementType);
leaveVariableTasks.add(new Runnable() { afterLoopLeaveVariableTasks.add(new Runnable() {
@Override @Override
public void run() { public void run() {
myFrameMap.leaveTemp(asmElementType); myFrameMap.leaveTemp(asmElementType);
} }
}); });
assignToLoopParameter(); }
}
public abstract void conditionAndJump(@NotNull Label loopExit);
public void beforeBody() {
v.mark(bodyStart);
assignToLoopParameter();
if (forExpression.getLoopParameter() == null) {
JetMultiDeclaration multiParameter = forExpression.getMultiParameter();
assert multiParameter != null;
generateMultiVariables(multiParameter.getEntries()); generateMultiVariables(multiParameter.getEntries());
} }
} }
protected abstract void assignToLoopParameter();
private void generateMultiVariables(List<JetMultiDeclarationEntry> entries) { private void generateMultiVariables(List<JetMultiDeclarationEntry> entries) {
Type asmElementType = asmType(elementType); Type asmElementType = asmType(elementType);
for (JetMultiDeclarationEntry variableDeclaration : entries) { for (JetMultiDeclarationEntry variableDeclaration : entries) {
@@ -596,7 +601,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@SuppressWarnings("ConstantConditions") final Type componentAsmType = asmType(componentDescriptor.getReturnType()); @SuppressWarnings("ConstantConditions") final Type componentAsmType = asmType(componentDescriptor.getReturnType());
final int componentVarIndex = myFrameMap.enter(componentDescriptor, componentAsmType); final int componentVarIndex = myFrameMap.enter(componentDescriptor, componentAsmType);
leaveVariableTasks.add(new Runnable() { afterBodyLeaveVariableTasks.add(new Runnable() {
@Override @Override
public void run() { public void run() {
myFrameMap.leave(componentDescriptor); myFrameMap.leave(componentDescriptor);
@@ -618,6 +623,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
} }
protected abstract void assignToLoopParameter();
public void body() { public void body() {
gen(forExpression.getBody(), Type.VOID_TYPE); gen(forExpression.getBody(), Type.VOID_TYPE);
} }
@@ -625,12 +632,16 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
public void afterBody() { public void afterBody() {
v.mark(bodyEnd); v.mark(bodyEnd);
// e goes out of scope // e goes out of scope
for (Runnable task : Lists.reverse(leaveVariableTasks)) { for (Runnable task : Lists.reverse(afterBodyLeaveVariableTasks)) {
task.run(); task.run();
} }
} }
public abstract void afterLoop(); public void afterLoop() {
for (Runnable task : Lists.reverse(afterLoopLeaveVariableTasks)) {
task.run();
}
}
} }
private class IteratorForLoopGenerator extends AbstractForLoopGenerator { private class IteratorForLoopGenerator extends AbstractForLoopGenerator {
@@ -660,6 +671,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Override @Override
public void beforeLoop() { public void beforeLoop() {
super.beforeLoop();
// Iterator<E> tmp<iterator> = c.iterator() // Iterator<E> tmp<iterator> = c.iterator()
iteratorVarIndex = myFrameMap.enterTemp(asmTypeForIterator); iteratorVarIndex = myFrameMap.enterTemp(asmTypeForIterator);
@@ -701,6 +714,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
public void afterLoop() { public void afterLoop() {
// tmp<iterator> goes out of scope // tmp<iterator> goes out of scope
myFrameMap.leaveTemp(asmTypeForIterator); myFrameMap.leaveTemp(asmTypeForIterator);
super.afterLoop();
} }
} }
@@ -717,6 +732,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Override @Override
public void beforeLoop() { public void beforeLoop() {
super.beforeLoop();
indexVar = myFrameMap.enterTemp(Type.INT_TYPE); indexVar = myFrameMap.enterTemp(Type.INT_TYPE);
JetExpression loopRange = forExpression.getLoopRange(); JetExpression loopRange = forExpression.getLoopRange();
@@ -779,6 +796,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
afterLoopAction.run(); afterLoopAction.run();
} }
myFrameMap.leaveTemp(Type.INT_TYPE); myFrameMap.leaveTemp(Type.INT_TYPE);
super.afterLoop();
} }
} }
@@ -801,6 +820,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Override @Override
public void beforeLoop() { public void beforeLoop() {
super.beforeLoop();
JetType elementType = RangeCodegenUtil.getPrimitiveRangeElementType(resolvedCall.getResultingDescriptor().getReturnType()); JetType elementType = RangeCodegenUtil.getPrimitiveRangeElementType(resolvedCall.getResultingDescriptor().getReturnType());
assert elementType != null; assert elementType != null;
asmElementType = asmType(elementType); asmElementType = asmType(elementType);
@@ -897,6 +917,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
public void afterLoop() { public void afterLoop() {
myFrameMap.leaveTemp(asmElementType); // lastVar myFrameMap.leaveTemp(asmElementType); // lastVar
myFrameMap.leaveTemp(asmElementType); // indexVar myFrameMap.leaveTemp(asmElementType); // indexVar
super.afterLoop();
} }
} }
@@ -912,6 +934,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Override @Override
public void beforeLoop() { public void beforeLoop() {
super.beforeLoop();
JetType loopRangeType = bindingContext.get(EXPRESSION_TYPE, forExpression.getLoopRange()); JetType loopRangeType = bindingContext.get(EXPRESSION_TYPE, forExpression.getLoopRange());
assert loopRangeType != null; assert loopRangeType != null;
Type asmLoopRangeType = asmType(loopRangeType); Type asmLoopRangeType = asmType(loopRangeType);
@@ -953,6 +977,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
public void afterLoop() { public void afterLoop() {
myFrameMap.leaveTemp(Type.INT_TYPE); // endVar myFrameMap.leaveTemp(Type.INT_TYPE); // endVar
myFrameMap.leaveTemp(Type.INT_TYPE); // indexVar myFrameMap.leaveTemp(Type.INT_TYPE); // indexVar
super.afterLoop();
} }
} }