use StackValue (and StackValue.expression() in particular) instead of Runnable as the expression in instanceof check

This commit is contained in:
Dmitry Jemerov
2011-07-06 13:44:47 +02:00
parent 89cafb3152
commit 71f521c05d
2 changed files with 30 additions and 23 deletions
@@ -1597,12 +1597,7 @@ public class ExpressionCodegen extends JetVisitor {
throw new UnsupportedOperationException("don't know how to handle non-class types in as/as?");
}
Type type = typeMapper.mapType(jetType, OwnerKind.INTERFACE);
generateInstanceOf(new Runnable() {
@Override
public void run() {
gen(expression.getLeft(), OBJECT_TYPE);
}
}, jetType, true);
generateInstanceOf(StackValue.expression(OBJECT_TYPE, expression.getLeft(), this), jetType, true);
Label isInstance = new Label();
v.ifne(isInstance);
v.pop();
@@ -1626,19 +1621,15 @@ public class ExpressionCodegen extends JetVisitor {
@Override
public void visitIsExpression(final JetIsExpression expression) {
generatePatternMatch(expression.getPattern(), expression.isNegated(), new Runnable() {
@Override
public void run() {
gen(expression.getLeftHandSide(), OBJECT_TYPE);
}
});
generatePatternMatch(expression.getPattern(), expression.isNegated(),
StackValue.expression(OBJECT_TYPE, expression.getLeftHandSide(), this));
}
private void generatePatternMatch(JetPattern pattern, boolean negated, Runnable expressionGen) {
private void generatePatternMatch(JetPattern pattern, boolean negated, StackValue expressionToMatch) {
if (pattern instanceof JetTypePattern) {
JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference();
JetType jetType = bindingContext.resolveTypeReference(typeReference);
generateInstanceOf(expressionGen, jetType, false);
generateInstanceOf(expressionToMatch, jetType, false);
StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE);
myStack.push(negated ? StackValue.not(value) : value);
}
@@ -1650,18 +1641,18 @@ public class ExpressionCodegen extends JetVisitor {
}
}
private void generateInstanceOf(Runnable expressionGen, JetType jetType, boolean leaveExpressionOnStack) {
private void generateInstanceOf(StackValue expressionToGen, JetType jetType, boolean leaveExpressionOnStack) {
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
if (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor)) {
generateTypeInfo(jetType);
expressionGen.run();
expressionToGen.put(OBJECT_TYPE, v);
if (leaveExpressionOnStack) {
v.dupX1();
}
v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z");
}
else {
expressionGen.run();
expressionToGen.put(OBJECT_TYPE, v);
if (leaveExpressionOnStack) {
v.dup();
}
@@ -1757,12 +1748,7 @@ public class ExpressionCodegen extends JetVisitor {
else if (condition instanceof JetWhenConditionIsPattern) {
JetWhenConditionIsPattern patternCondition = (JetWhenConditionIsPattern) condition;
JetPattern pattern = patternCondition.getPattern();
generatePatternMatch(pattern, patternCondition.isNegated(), new Runnable() {
@Override
public void run() {
new StackValue.Local(subjectLocal, subjectType).put(OBJECT_TYPE, v);
}
});
generatePatternMatch(pattern, patternCondition.isNegated(), StackValue.local(subjectLocal, subjectType));
}
else {
throw new UnsupportedOperationException("unsupported kind of when condition");
@@ -1,6 +1,7 @@
package org.jetbrains.jet.codegen;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lexer.JetTokens;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
@@ -83,6 +84,10 @@ public abstract class StackValue {
return new Property(name, owner, getter, setter, isStatic, isInterface, type);
}
public static StackValue expression(Type type, JetExpression expression, ExpressionCodegen generator) {
return new Expression(type, expression, generator);
}
private static void box(final Type type, final Type toType, InstructionAdapter v) {
// TODO handle toType correctly
if (type == Type.INT_TYPE || (JetTypeMapper.isIntPrimitive(type) && toType.getInternalName().equals("java/lang/Integer"))) {
@@ -538,4 +543,20 @@ public abstract class StackValue {
}
}
}
private static class Expression extends StackValue {
private final JetExpression expression;
private final ExpressionCodegen generator;
public Expression(Type type, JetExpression expression, ExpressionCodegen generator) {
super(type);
this.expression = expression;
this.generator = generator;
}
@Override
public void put(Type type, InstructionAdapter v) {
generator.gen(expression, type);
}
}
}