refactoring: whenever possible, pass StackValue directly instead of messing with myStack
This commit is contained in:
@@ -163,9 +163,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
public void visitIfExpression(JetIfExpression expression) {
|
public void visitIfExpression(JetIfExpression expression) {
|
||||||
JetType expressionType = bindingContext.getExpressionType(expression);
|
JetType expressionType = bindingContext.getExpressionType(expression);
|
||||||
Type asmType = typeMapper.mapType(expressionType);
|
Type asmType = typeMapper.mapType(expressionType);
|
||||||
int oldStackDepth = myStack.size();
|
StackValue condition = generateIntermediateValue(expression.getCondition());
|
||||||
gen(expression.getCondition());
|
|
||||||
assert myStack.size() == oldStackDepth+1;
|
|
||||||
|
|
||||||
JetExpression thenExpression = expression.getThen();
|
JetExpression thenExpression = expression.getThen();
|
||||||
JetExpression elseExpression = expression.getElse();
|
JetExpression elseExpression = expression.getElse();
|
||||||
@@ -175,18 +173,18 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (thenExpression == null) {
|
if (thenExpression == null) {
|
||||||
generateSingleBranchIf(elseExpression, false);
|
generateSingleBranchIf(condition, elseExpression, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elseExpression == null) {
|
if (elseExpression == null) {
|
||||||
generateSingleBranchIf(thenExpression, true);
|
generateSingleBranchIf(condition, thenExpression, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Label elseLabel = new Label();
|
Label elseLabel = new Label();
|
||||||
myStack.pop().condJump(elseLabel, true, v); // == 0, i.e. false
|
condition.condJump(elseLabel, true, v); // == 0, i.e. false
|
||||||
|
|
||||||
gen(thenExpression, asmType);
|
gen(thenExpression, asmType);
|
||||||
|
|
||||||
@@ -211,8 +209,8 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
Label end = new Label();
|
Label end = new Label();
|
||||||
myBreakTargets.push(end);
|
myBreakTargets.push(end);
|
||||||
|
|
||||||
gen(expression.getCondition());
|
final StackValue conditionValue = generateIntermediateValue(expression.getCondition());
|
||||||
myStack.pop().condJump(end, true, v);
|
conditionValue.condJump(end, true, v);
|
||||||
|
|
||||||
gen(expression.getBody(), Type.VOID_TYPE);
|
gen(expression.getBody(), Type.VOID_TYPE);
|
||||||
v.goTo(condition);
|
v.goTo(condition);
|
||||||
@@ -233,8 +231,8 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
|
|
||||||
gen(expression.getBody(), Type.VOID_TYPE);
|
gen(expression.getBody(), Type.VOID_TYPE);
|
||||||
|
|
||||||
gen(expression.getCondition());
|
final StackValue conditionValue = generateIntermediateValue(expression.getCondition());
|
||||||
myStack.pop().condJump(condition, false, v);
|
conditionValue.condJump(condition, false, v);
|
||||||
|
|
||||||
v.mark(end);
|
v.mark(end);
|
||||||
|
|
||||||
@@ -475,10 +473,10 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
v.goTo(label);
|
v.goTo(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateSingleBranchIf(JetExpression expression, boolean inverse) {
|
private void generateSingleBranchIf(StackValue condition, JetExpression expression, boolean inverse) {
|
||||||
Label endLabel = new Label();
|
Label endLabel = new Label();
|
||||||
|
|
||||||
myStack.pop().condJump(endLabel, inverse, v);
|
condition.condJump(endLabel, inverse, v);
|
||||||
|
|
||||||
gen(expression, Type.VOID_TYPE);
|
gen(expression, Type.VOID_TYPE);
|
||||||
|
|
||||||
@@ -1095,8 +1093,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
Label ifFalse = new Label();
|
Label ifFalse = new Label();
|
||||||
Label end = new Label();
|
Label end = new Label();
|
||||||
v.dup();
|
v.dup();
|
||||||
gen(expression.getSelectorExpression());
|
StackValue result = generateIntermediateValue(expression.getSelectorExpression());
|
||||||
StackValue result = myStack.pop();
|
|
||||||
result.condJump(ifFalse, true, v);
|
result.condJump(ifFalse, true, v);
|
||||||
v.goTo(end);
|
v.goTo(end);
|
||||||
v.mark(ifFalse);
|
v.mark(ifFalse);
|
||||||
@@ -1184,24 +1181,24 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
final Type rightType = expressionType(right);
|
final Type rightType = expressionType(right);
|
||||||
gen(left, leftType);
|
gen(left, leftType);
|
||||||
gen(right, rightType);
|
gen(right, rightType);
|
||||||
generateEqualsForExpressionsOnStack(opToken, leftType, rightType);
|
myStack.push(generateEqualsForExpressionsOnStack(opToken, leftType, rightType));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateEqualsForExpressionsOnStack(IElementType opToken, Type leftType, Type rightType) {
|
private StackValue generateEqualsForExpressionsOnStack(IElementType opToken, Type leftType, Type rightType) {
|
||||||
if (isNumberPrimitive(leftType) && leftType == rightType) {
|
if (isNumberPrimitive(leftType) && leftType == rightType) {
|
||||||
compareExpressionsOnStack(opToken, leftType);
|
return compareExpressionsOnStack(opToken, leftType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (opToken == JetTokens.EQEQEQ || opToken == JetTokens.EXCLEQEQEQ) {
|
if (opToken == JetTokens.EQEQEQ || opToken == JetTokens.EXCLEQEQEQ) {
|
||||||
myStack.push(StackValue.cmp(opToken, leftType));
|
return StackValue.cmp(opToken, leftType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
generateNullSafeEquals(opToken);
|
return generateNullSafeEquals(opToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateNullSafeEquals(IElementType opToken) {
|
private StackValue generateNullSafeEquals(IElementType opToken) {
|
||||||
v.dup2(); // left right left right
|
v.dup2(); // left right left right
|
||||||
Label rightNull = new Label();
|
Label rightNull = new Label();
|
||||||
v.ifnull(rightNull);
|
v.ifnull(rightNull);
|
||||||
@@ -1225,11 +1222,9 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
|
|
||||||
final StackValue onStack = StackValue.onStack(Type.BOOLEAN_TYPE);
|
final StackValue onStack = StackValue.onStack(Type.BOOLEAN_TYPE);
|
||||||
if (opToken == JetTokens.EXCLEQ) {
|
if (opToken == JetTokens.EXCLEQ) {
|
||||||
myStack.push(StackValue.not(onStack));
|
return StackValue.not(onStack);
|
||||||
}
|
|
||||||
else {
|
|
||||||
myStack.push(onStack);
|
|
||||||
}
|
}
|
||||||
|
return onStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateElvis(JetBinaryExpression expression) {
|
private void generateElvis(JetBinaryExpression expression) {
|
||||||
@@ -1319,16 +1314,16 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
private void generateCompareOp(JetExpression left, JetExpression right, IElementType opToken, Type operandType) {
|
private void generateCompareOp(JetExpression left, JetExpression right, IElementType opToken, Type operandType) {
|
||||||
gen(left, operandType);
|
gen(left, operandType);
|
||||||
gen(right, operandType);
|
gen(right, operandType);
|
||||||
compareExpressionsOnStack(opToken, operandType);
|
myStack.push(compareExpressionsOnStack(opToken, operandType));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void compareExpressionsOnStack(IElementType opToken, Type operandType) {
|
private StackValue compareExpressionsOnStack(IElementType opToken, Type operandType) {
|
||||||
if (operandType.getSort() == Type.OBJECT) {
|
if (operandType.getSort() == Type.OBJECT) {
|
||||||
v.invokeinterface(CLASS_COMPARABLE, "compareTo", "(Ljava/lang/Object;)I");
|
v.invokeinterface(CLASS_COMPARABLE, "compareTo", "(Ljava/lang/Object;)I");
|
||||||
v.aconst(0);
|
v.aconst(0);
|
||||||
operandType = Type.INT_TYPE;
|
operandType = Type.INT_TYPE;
|
||||||
}
|
}
|
||||||
myStack.push(StackValue.cmp(opToken, operandType));
|
return StackValue.cmp(opToken, operandType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateAssignmentExpression(JetBinaryExpression expression) {
|
private void generateAssignmentExpression(JetBinaryExpression expression) {
|
||||||
@@ -1749,8 +1744,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
JetExpression condExpression = ((JetExpressionPattern) pattern).getExpression();
|
JetExpression condExpression = ((JetExpressionPattern) pattern).getExpression();
|
||||||
Type condType = isNumberPrimitive(subjectType) ? expressionType(condExpression) : OBJECT_TYPE;
|
Type condType = isNumberPrimitive(subjectType) ? expressionType(condExpression) : OBJECT_TYPE;
|
||||||
gen(condExpression, condType);
|
gen(condExpression, condType);
|
||||||
generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType);
|
return generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType);
|
||||||
return myStack.pop();
|
|
||||||
}
|
}
|
||||||
else if (pattern instanceof JetWildcardPattern) {
|
else if (pattern instanceof JetWildcardPattern) {
|
||||||
return StackValue.constant(!negated, Type.BOOLEAN_TYPE);
|
return StackValue.constant(!negated, Type.BOOLEAN_TYPE);
|
||||||
|
|||||||
Reference in New Issue
Block a user