When-statements & correct line numbers

This commit is contained in:
Alexander Udalov
2012-11-22 18:51:30 +04:00
parent aa898725fc
commit 9d3907ff98
8 changed files with 76 additions and 1 deletions
@@ -39,4 +39,9 @@ public class CodegenStatementVisitor extends JetVisitor<StackValue, StackValue>
public StackValue visitTryExpression(JetTryExpression expression, StackValue data) {
return codegen.generateTryExpression(expression, true);
}
@Override
public StackValue visitWhenExpression(JetWhenExpression expression, StackValue data) {
return codegen.generateWhenExpression(expression, true);
}
}
@@ -3378,10 +3378,14 @@ The "returned" value of try expression with no finally is either the last expres
@Override
public StackValue visitWhenExpression(JetWhenExpression expression, StackValue receiver) {
return generateWhenExpression(expression, false);
}
public StackValue generateWhenExpression(JetWhenExpression expression, boolean isStatement) {
JetExpression expr = expression.getSubjectExpression();
JetType subjectJetType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expr);
final Type subjectType = asmTypeOrVoid(subjectJetType);
final Type resultType = expressionType(expression);
final Type resultType = isStatement ? Type.VOID_TYPE : expressionType(expression);
final int subjectLocal = expr != null ? myFrameMap.enterTemp(subjectType) : -1;
if (subjectLocal != -1) {
gen(expr, subjectType);
@@ -3432,6 +3436,8 @@ The "returned" value of try expression with no finally is either the last expres
v.mark(nextCondition);
throwNewException(CLASS_NO_PATTERN_MATCHED_EXCEPTION);
}
markLineNumber(expression);
v.mark(end);
myFrameMap.leaveTemp(subjectType);