Simplified afterLoop(): no overriding.
This commit is contained in:
@@ -684,6 +684,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
// Iterator<E> tmp<iterator> = c.iterator()
|
// Iterator<E> tmp<iterator> = c.iterator()
|
||||||
|
|
||||||
iteratorVarIndex = myFrameMap.enterTemp(asmTypeForIterator);
|
iteratorVarIndex = myFrameMap.enterTemp(asmTypeForIterator);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(asmTypeForIterator);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Call call = bindingContext.get(LOOP_RANGE_ITERATOR_CALL, forExpression.getLoopRange());
|
Call call = bindingContext.get(LOOP_RANGE_ITERATOR_CALL, forExpression.getLoopRange());
|
||||||
invokeFunction(call, StackValue.none(), iteratorCall);
|
invokeFunction(call, StackValue.none(), iteratorCall);
|
||||||
@@ -717,20 +723,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
v.store(loopParameterVar, asmType(nextCall.getResultingDescriptor().getReturnType()));
|
v.store(loopParameterVar, asmType(nextCall.getResultingDescriptor().getReturnType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterLoop() {
|
|
||||||
// tmp<iterator> goes out of scope
|
|
||||||
myFrameMap.leaveTemp(asmTypeForIterator);
|
|
||||||
|
|
||||||
super.afterLoop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ForInArrayLoopGenerator extends AbstractForLoopGenerator {
|
private class ForInArrayLoopGenerator extends AbstractForLoopGenerator {
|
||||||
private int indexVar;
|
private int indexVar;
|
||||||
private int arrayVar;
|
private int arrayVar;
|
||||||
private Runnable afterLoopAction;
|
|
||||||
private final JetType loopRangeType;
|
private final JetType loopRangeType;
|
||||||
|
|
||||||
private ForInArrayLoopGenerator(@NotNull JetForExpression forExpression) {
|
private ForInArrayLoopGenerator(@NotNull JetForExpression forExpression) {
|
||||||
@@ -743,6 +740,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
super.beforeLoop();
|
super.beforeLoop();
|
||||||
|
|
||||||
indexVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
indexVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
JetExpression loopRange = forExpression.getLoopRange();
|
JetExpression loopRange = forExpression.getLoopRange();
|
||||||
StackValue value = gen(loopRange);
|
StackValue value = gen(loopRange);
|
||||||
@@ -752,12 +755,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
arrayVar = myFrameMap.enterTemp(OBJECT_TYPE);
|
arrayVar = myFrameMap.enterTemp(OBJECT_TYPE);
|
||||||
afterLoopAction = new Runnable() {
|
runAfterLoop(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
myFrameMap.leaveTemp(OBJECT_TYPE);
|
myFrameMap.leaveTemp(OBJECT_TYPE);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
value.put(asmLoopRangeType, v);
|
value.put(asmLoopRangeType, v);
|
||||||
v.store(arrayVar, OBJECT_TYPE);
|
v.store(arrayVar, OBJECT_TYPE);
|
||||||
}
|
}
|
||||||
@@ -797,16 +800,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
v.iinc(indexVar, 1);
|
v.iinc(indexVar, 1);
|
||||||
super.afterBody();
|
super.afterBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterLoop() {
|
|
||||||
if (afterLoopAction != null) {
|
|
||||||
afterLoopAction.run();
|
|
||||||
}
|
|
||||||
myFrameMap.leaveTemp(Type.INT_TYPE);
|
|
||||||
|
|
||||||
super.afterLoop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ForInRangeLiteralLoopGenerator extends AbstractForLoopGenerator {
|
private class ForInRangeLiteralLoopGenerator extends AbstractForLoopGenerator {
|
||||||
@@ -834,10 +827,22 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
asmElementType = asmType(elementType);
|
asmElementType = asmType(elementType);
|
||||||
|
|
||||||
indexVar = myFrameMap.enterTemp(asmElementType);
|
indexVar = myFrameMap.enterTemp(asmElementType);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(asmElementType);
|
||||||
|
}
|
||||||
|
});
|
||||||
gen(rangeCall.left, asmElementType);
|
gen(rangeCall.left, asmElementType);
|
||||||
v.store(indexVar, asmElementType);
|
v.store(indexVar, asmElementType);
|
||||||
|
|
||||||
lastVar = myFrameMap.enterTemp(asmElementType);
|
lastVar = myFrameMap.enterTemp(asmElementType);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(asmElementType);
|
||||||
|
}
|
||||||
|
});
|
||||||
gen(rangeCall.right, asmElementType);
|
gen(rangeCall.right, asmElementType);
|
||||||
v.store(lastVar, asmElementType);
|
v.store(lastVar, asmElementType);
|
||||||
}
|
}
|
||||||
@@ -920,14 +925,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
}
|
}
|
||||||
super.afterBody();
|
super.afterBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterLoop() {
|
|
||||||
myFrameMap.leaveTemp(asmElementType); // lastVar
|
|
||||||
myFrameMap.leaveTemp(asmElementType); // indexVar
|
|
||||||
|
|
||||||
super.afterLoop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ForInIntRangeInstanceLoopGenerator extends AbstractForLoopGenerator {
|
private class ForInIntRangeInstanceLoopGenerator extends AbstractForLoopGenerator {
|
||||||
@@ -951,11 +948,23 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
v.dup();
|
v.dup();
|
||||||
|
|
||||||
indexVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
indexVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
});
|
||||||
v.invokevirtual(JET_INT_RANGE_TYPE.getInternalName(), "getStart", "()Ljava/lang/Integer;");
|
v.invokevirtual(JET_INT_RANGE_TYPE.getInternalName(), "getStart", "()Ljava/lang/Integer;");
|
||||||
StackValue.coerce(Type.getType("Ljava/lang/Integer;"), Type.INT_TYPE, v);
|
StackValue.coerce(Type.getType("Ljava/lang/Integer;"), Type.INT_TYPE, v);
|
||||||
v.store(indexVar, Type.INT_TYPE);
|
v.store(indexVar, Type.INT_TYPE);
|
||||||
|
|
||||||
endVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
endVar = myFrameMap.enterTemp(Type.INT_TYPE);
|
||||||
|
runAfterLoop(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
myFrameMap.leaveTemp(Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
});
|
||||||
v.invokevirtual(JET_INT_RANGE_TYPE.getInternalName(), "getEnd", "()Ljava/lang/Integer;");
|
v.invokevirtual(JET_INT_RANGE_TYPE.getInternalName(), "getEnd", "()Ljava/lang/Integer;");
|
||||||
StackValue.coerce(Type.getType("Ljava/lang/Integer;"), Type.INT_TYPE, v);
|
StackValue.coerce(Type.getType("Ljava/lang/Integer;"), Type.INT_TYPE, v);
|
||||||
v.store(endVar, Type.INT_TYPE);
|
v.store(endVar, Type.INT_TYPE);
|
||||||
@@ -980,14 +989,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
v.iinc(indexVar, 1);
|
v.iinc(indexVar, 1);
|
||||||
super.afterBody();
|
super.afterBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterLoop() {
|
|
||||||
myFrameMap.leaveTemp(Type.INT_TYPE); // endVar
|
|
||||||
myFrameMap.leaveTemp(Type.INT_TYPE); // indexVar
|
|
||||||
|
|
||||||
super.afterLoop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user